Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么java.util.Date对象满足一个规范测试,但另一个测试失败?_Scala_Playframework_Specs2 - Fatal编程技术网

Scala 为什么java.util.Date对象满足一个规范测试,但另一个测试失败?

Scala 为什么java.util.Date对象满足一个规范测试,但另一个测试失败?,scala,playframework,specs2,Scala,Playframework,Specs2,我正在尝试使用PlayFramework2.0和Specs2测试一个模型方法。Global.scala在第一次运行时用数据填充数据库。在一个测试中,我可以使用如下代码成功地测试它: def dateHelper(str: String): Date = new SimpleDateFormat("MM/dd/yyyy").parse(str) "Food model" should { "be retrieved by id" in { val Some(mashedPotatoe

我正在尝试使用PlayFramework2.0和Specs2测试一个模型方法。Global.scala在第一次运行时用数据填充数据库。在一个测试中,我可以使用如下代码成功地测试它:

def dateHelper(str: String): Date = new SimpleDateFormat("MM/dd/yyyy").parse(str)

"Food model" should {
  "be retrieved by id" in {
    val Some(mashedPotatoes) = Food.findById(1000)

    mashedPotatoes.name must equalTo("Mashed Potatoes")
    mashedPotatoes.eaten must equalTo(false)
    mashedPotatoes.id must equalTo(Id(1000))
    mashedPotatoes.owner must equalTo(Id(1))
    mashedPotatoes.expiry must equalTo(dateHelper("05/21/2012"))
  }
}
那项测试通过了。但如果我尝试从模型中选择多个项目,并将其作为列表进行测试:

"return food for test user in " in {

  running(FakeApplication()) {
    val testFoods: Seq[Food] = Food.findFoodFor(Id(1)) // Test user's ID is 1

// This test fails        
    testFoods must equalTo(
      List(
        Food(Id(1001), "Fried Green Tomatoes", false, Id(1), dateHelper("04/21/2012")),
        Food(Id(1000), "Mashed Potatoes", false, Id(1), dateHelper("05/21/2012"))
      )
    )

// This test passes
    testFoods.head.expiry must equalTo(dateHelper("04/21/2012"))
  }
}
错误输出告诉我日期字段不相等:

[error] x return food for test user in
[error]     'Food(1001,Fried Green Tomatoes,false,1,2012-04-21 00:00:00.0), Food(1000,Mashed Potatoes,false,1,2012-05-21 00:00:00.0)' is not equal to 'Food(1001,Fried Green Tomatoes,false,1,Sat Apr 21 00:00:00 EDT 2012), Food(1000,Mashed Potatoes,false,1,Mon May 21 00:00:00 EDT 2012)' (ModelSpec.scala:66)
[error] Expected: ...se,1,[Sat Apr ]21...00[ EDT 2]0[12]),...1,[Mon May ]21...00[ EDT 2]0[12])
[error] Actual:   ...se,1,[2012-04-]21...00[.]0[]),...1,[2012-05-]21...00[.]0[])
这里有我遗漏的东西吗

编辑:看起来是DB模式,它将到期列设置为timestamp类型,而不是date类型


这里有更有用的信息:

问题可能是因为数据是如何从数据库加载的。我打赌它是用而不是

如果你阅读,你会发现这句很好的话:

由于Timestamp类和上面提到的java.util.Date类之间的差异,建议代码不要将时间戳值一般地作为java.util.Date的实例来查看。Timestamp和java.util.Date之间的继承关系实际上表示实现继承,而不是类型继承


您的ORM映射或数据库模式中可能有错误。列是带有时区的
日期
还是
时间戳
时间戳?如果是
日期
,则应将其映射到,并正确比较。如果它是带有时区的
时间戳
,那么您的
日期助手
应该构建
时间戳
s。如果是
时间戳
,祝你好运,因为数据库将丢失时区信息。

如果你这样做会怎么样:testFoods.head必须等于(Food(Id(1001),“Fried Green Tomatos”,false,Id(1),dateHelper(“04/21/2012”))。这也失败了吗?你确实错过了一些东西:乔达时间;-)这可能不是问题所在,但在Scala这样鼓励不变性的语言中,Joda Time比SimpleDataFormat更适合。不管问题是什么,我很想知道SDF是否是罪魁祸首……看起来是模式。架构被设置为时间戳。我试着将它设置为最新,然后重新运行一切。现在都是绿色的了。我还发现了这个,看起来它有一些有用的相关信息(还有另一个用于joda time的插件):
scala> val date = dateHelper("05/12/1974")
d: java.util.Date = Sun May 12 00:00:00 CDT 1974

scala> val dbDate = new java.sql.Timestamp(d.getTime)
dbDate: java.sql.Timestamp = 1974-05-12 00:00:00.0

scala> date == dbDate
res6: Boolean = true

scala> dbDate == date // prepare to be amazed!
res5: Boolean = false