首页 > 解决方案 > ScalaTest:在同一毫秒内将 Instant 视为相等

问题描述

我有一个我序列化为 JSON 的案例类,以及一个检查往返工作的测试案例。

深埋在案例类中的是java.time.Instants,我将其放入 JSON 作为它们的纪元毫秒。

事实证明,anInstant实际上具有纳秒精度,并且在翻译中丢失,导致测试失败,因为时间戳现在稍微偏离。

有没有一种简单的方法可以让 Scalatest 忽略差异?我只想修复测试,应用程序完全可以接受精度损失。

标签: scalascalatestnanotimejava.time.instant

解决方案


我们使用 Clock.instant 来知道当前时间,而不是 Instant.now 来避免这个问题。所以类的代码应该是这样的

class MyClass(clock: Clock) {
  def getResult(): Result = {
    Result(clock.instant)
  }
}

在测试中,我们模拟 clock.instant 以保证我们检查的时间完全相同。

class MyClassTest {
  val customTime = Instant.now
  val clock = mock[Clock]
  clock.instant() returns customTime

  // test
  val myClass = new MyClass(clock)
  val expectedResult = Result(customTime)
  myClass.getResult ==== expectedResult
}

推荐阅读