I found what I believe is a bug in TestEngine.java which is tangential to my actual issue. The unit test in question tried to calls `create()` on the model in question, which generates the following RuntimeException:
java.lang.RuntimeException: no supported constructors for type models.Recipe
at play.db.anorm.Analyser$$anonfun$50.apply(Anorm.scala:704)
at play.db.anorm.Analyser$$anonfun$50.apply(Anorm.scala:704)
at scala.Option.getOrElse(Option.scala:104)
at play.db.anorm.Analyser$class.$init$(Anorm.scala:704)
at play.db.anorm.Analyse.<init>(Anorm.scala:662)
at play.db.anorm.MParser$$anon$1.<init>(Anorm.scala:556)
at play.db.anorm.MParser$class.$init$(Anorm.scala:556)
at play.db.anorm.Convention$Magic.<init>(Anorm.scala:357)
at models.Recipe$.<init>(Recipe.scala:17)
at models.Recipe$.<clinit>(Recipe.scala)
at RecipeSpec$$anonfun$1.apply$mcV$sp(RecipeSpec.scala:15)
at RecipeSpec$$anonfun$1.apply(RecipeSpec.scala:12)
at RecipeSpec$$anonfun$1.apply(RecipeSpec.scala:12)
at org.scalatest.FlatSpec$$anon$2.apply(FlatSpec.scala:2563)
at org.scalatest.Suite$class.withFixture(Suite.scala:1509)
at RecipeSpec.withFixture(RecipeSpec.scala:8)
at org.scalatest.FlatSpec$class.runTest(FlatSpec.scala:2560)
at RecipeSpec.org$scalatest$BeforeAndAfterEach$$super$runTest(RecipeSpec.scala:8)
at org.scalatest.BeforeAndAfterEach$class.runTest(BeforeAndAfterEach.scala:167)
at RecipeSpec.runTest(RecipeSpec.scala:8)
at org.scalatest.FlatSpec$$anonfun$org$scalatest$FlatSpec$$runTestsInBranch$1.apply(FlatSpec.scala:2485)
at org.scalatest.FlatSpec$$anonfun$org$scalatest$FlatSpec$$runTestsInBranch$1.apply(FlatSpec.scala:2474)
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:61)
at scala.collection.immutable.List.foreach(List.scala:45)
at org.scalatest.FlatSpec$
class.org$scalatest$FlatSpec$$runTestsInBranch(FlatSpec.scala:2473)
at org.scalatest.FlatSpec$class.runTests(FlatSpec.scala:2687)
at RecipeSpec.runTests(RecipeSpec.scala:8)
at org.scalatest.Suite$class.run(Suite.scala:1804)
at RecipeSpec.org$scalatest$FlatSpec$$super$run(RecipeSpec.scala:8)
at org.scalatest.FlatSpec$class.run(FlatSpec.scala:2758)
at RecipeSpec.run(RecipeSpec.scala:8)
at org.scalatest.tools.SuiteRunner.run(SuiteRunner.scala:59)
at org.scalatest.tools.ScalaTestRunner$.run(ScalaTestRunner.scala:61)
at org.scalatest.tools.ScalaTestRunner$.runSuiteClass(ScalaTestRunner.scala:17)
at play.server.PlayHandler$NettyInvocation.execute(PlayHandler.java:220)
at play.Invoker$Invocation.run(Invoker.java:265)
at play.server.PlayHandler$NettyInvocation.run(PlayHandler.java:200)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
This RuntimeException bubbles up into an ExceptionInInitializerError, whose `getMessage` method returns null. `ScalaTestRunner.runSuiteClass` sets `result.error` equal to this null message and passes the result to TestResults.add, which throws a NullPointException when calling `result.error.startsWith`.
This still doesn't explain why Anorm doesn't support java.sql.{Date, Timestamp}. The fundamental exception here complains that a valid constructor doesn't exist, which isn't true:
// Scala constructor.
# SQL evolution.