首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ScalaTest:在相同毫秒内将即时处理为相等

ScalaTest:在相同毫秒内将即时处理为相等
EN

Stack Overflow用户
提问于 2018-12-13 15:20:34
回答 2查看 816关注 0票数 4

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

在案例类的深处隐藏着java.time.Instant,我将其作为它们的时代毫秒放入JSON中。

结果是一个 actually has nanosecond precision在翻译中丢失了,使得测试失败了,因为时间戳现在有点差了。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-13 15:43:14

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

代码语言:javascript
复制
class MyClass(clock: Clock) {
  def getResult(): Result = {
    Result(clock.instant)
  }
}

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

代码语言:javascript
复制
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
}
票数 4
EN

Stack Overflow用户

发布于 2018-12-14 08:44:24

在比较之前截断到毫秒

我不确定它对您的情况是否有帮助,但是对于其他人来说,如果您正在阅读:比较两个只考虑毫秒和粗的Instant对象的正确方法是截断每个对象到毫秒的精度(这里是Java中的):

代码语言:javascript
复制
    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进行测试通常是个好主意。它可以帮助你编写可重复的测试。您可以很容易地拥有一个只计算毫秒的时钟:

代码语言:javascript
复制
    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

正如您所看到的,生成的Instant对象在秒上只有三个小数,即毫秒精度,没有比这更精细的了。当您只使用Clock绘制Instants时,您传递给tickMillis的时区并不重要。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53764994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档