我有一个向JSON序列化的case类,还有一个检查往返工作的测试用例。
在案例类的深处隐藏着java.time.Instant,我将其作为它们的时代毫秒放入JSON中。
结果是一个 actually has nanosecond precision在翻译中丢失了,使得测试失败了,因为时间戳现在有点差了。
有什么简单的方法可以让Scalatest忽略这种差异吗?我只想修复测试,精度损失是完全可以接受的应用程序。
发布于 2018-12-13 15:43:14
为了避免这个问题,我们使用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
}发布于 2018-12-14 08:44:24
在比较之前截断到毫秒
我不确定它对您的情况是否有帮助,但是对于其他人来说,如果您正在阅读:比较两个只考虑毫秒和粗的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
正如您所看到的,生成的Instant对象在秒上只有三个小数,即毫秒精度,没有比这更精细的了。当您只使用Clock绘制Instants时,您传递给tickMillis的时区并不重要。
https://stackoverflow.com/questions/53764994
复制相似问题