代码之家  ›  专栏  ›  技术社区  ›  Thilo

ScalaTest:在同一毫秒内将瞬间视为相等

  •  2
  • Thilo  · 技术社区  · 7 年前

    我有一个序列化为JSON的case类,还有一个检查往返工作的测试用例。

    java.time.Instant s、 我把它作为它们的历元毫秒放在JSON中。

    Instant actually has nanosecond precision 这会在翻译过程中丢失,导致测试失败,因为时间戳现在稍微偏移了。

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

    2 回复  |  直到 7 年前
        1
  •  4
  •   Mahmoud Hanafy    7 年前

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

    class MyClass(clock: Clock) {
      def getResult(): Result = {
        Result(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
    }
    
        2
  •  4
  •   Anonymous    7 年前

    在比较之前截断为毫秒

    我不确定这对你的情况是否有帮助,但为了以防万一,也为了其他人阅读:比较两者的正确方法 Instant 仅考虑毫秒和更粗的对象是将每个对象截断为毫秒精度(在Java中):

        Instant instant1 = Instant.parse("2018-12-14T08:25:54.232235133Z");
        Instant instant2 = Instant.parse("2018-12-14T08:25:54.232975217Z");
        if (instant1.truncatedTo(ChronoUnit.MILLIS).equals(instant2.truncatedTo(ChronoUnit.MILLIS))) {
            System.out.println("Equal to the millisecond");
        } else {
            System.out.println("Not equal to the millisecond");
        }
    

    输出:

    等于毫秒

    如果你知道一个事实,其中一个已经在JSON的往返中被截断(并且你认为它是必须的),你当然不需要再次截断。

    使用只有毫秒精度的时钟

    Clock 因为测试通常是个好主意。它可以帮助您编写可复制的测试。您可以轻松拥有一个只计算毫秒的时钟:

        Clock c = Clock.tickMillis(ZoneOffset.UTC);
        System.out.println(c.instant());
        System.out.println(Instant.now(c));
    

    刚刚运行时的输出:

    2018-12-14T10:48:47.929Z
    2018-12-14T10:48:47.945Z
    

    如您所见,生成的 瞬间 对象在秒上只有三个小数,即毫秒精度,没有更高的精度。当你只使用 瞬间 s、 你去哪个时区并不重要 tickMillis .

    推荐文章