加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 为什么java.util.Date对象满足一个Specs测试但是失败另

发布时间:2020-12-16 08:48:01 所属栏目:安全 来源:网络整理
导读:我正在尝试使用Play Framework 2.0和Specs2测试模型方法. Global. scala在首次运行时使用数据填充数据库.在一个测试中,我可以使用如下代码成功测试它: def dateHelper(str: String): Date = new SimpleDateFormat("MM/dd/yyyy").parse(str)"Food model" sho
我正在尝试使用Play Framework 2.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",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,1,2012-04-21 00:00:00.0),Food(1000,Mashed Potatoes,2012-05-21 00:00:00.0)' is not equal to 'Food(1001,Sat Apr 21 00:00:00 EDT 2012),Mon May 21 00:00:00 EDT 2012)' (ModelSpec.scala:66)
[error] Expected: ...se,[Sat Apr ]21...00[ EDT 2]0[12]),...1,[Mon May ]21...00[ EDT 2]0[12])
[error] Actual:   ...se,[2012-04-]21...00[.]0[]),[2012-05-]21...00[.]0[])

这里有什么我想念的东西吗?

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

这里更有帮助的信息:java.util.Date vs java.sql.Date

解决方法

问题可能是因为数据从数据库加载的方式.我打赌它使用的是 java.sql.Timestamp而不是 java.util.Date.

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

如果您阅读the fine print in the Javadoc,您会发现这个不错的小声明:

Due to the differences between the Timestamp class and the java.util.Date class mentioned above,it is recommended that code not view Timestamp values generically as an instance of java.util.Date. The inheritance relationship between Timestamp and java.util.Date really denotes implementation inheritance,and not type inheritance.

您的ORM映射或数据库架构可能有问题.列是DATE还是TIMESTAMP或TIMESTAMP WITH TIMEZONE?如果它是DATE,你应该将它映射到java.sql.Date,这应该正确比较.如果它是TIMESTAMP WITH TIMEZONE,那么你的dateHelper应该构建时间戳.如果它是TIMESTAMP,祝你好运,因为数据库将丢失时区信息.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读