【发布时间】:2020-08-07 01:28:42
【问题描述】:
我想证明,作为单元测试的一部分,我编写的一段代码不受默认时区(设置为 JVM 属性或通过 setDefault() 方法)的影响。
有没有办法做到这一点?
这不像在调用方法之前在测试中设置默认时区那么简单,因为我正在尝试针对竞争条件测试安全性。例如,考虑以下情况:
Calendar calendar = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
assertEquals(calendar.get(Calendar.DATE), calendar2.get(Calendar.DATE));
这个测试应该可以通过,但是如果默认时区在从 GMT 到新加坡的两个 getInstance() 调用之间突然发生变化,因为在某处运行的另一段代码更改了默认时区,会发生什么?那么我们就有可能失败的情况。
我能想到的唯一表明它不会对所有可能的更改产生影响的方法是,以某种方式断言代码不会访问默认时区值,无论它在哪里。
【问题讨论】:
-
也许是一个参数化测试,它需要不同的时区来调用 TimeZone.setDefault(...),并为所有情况断言相同的结果。显示一些代码会有所帮助。
-
您好安德鲁,感谢您的评论。我编辑了问题以使其更清晰,并添加了一个基本代码 sn-p 可以更好地说明问题。
-
仍然不确定:您要确保没有代码更改默认时区,还是要确保您的代码不关心默认时区是什么?
-
第一种可以用Checkstyle之类的工具检查,也可以直接搜索源码;但后者可能是更安全的方法。 Andrew 已经建议如何做到这一点,如果您想到竞争条件(为什么会发生这种情况?),您可以在测试中运行多个线程,但这会变得混乱 :-(
-
感谢您的评论。我想确保我自己的代码不关心默认时区是什么。我知道正在运行的其他代码确实会更改默认时区,因此这是我的代码与其他一些我无法更改的代码之间的竞争条件。我需要单元测试的原因是我试图证明代码更改会导致修复,所以基本上单元测试在更改之前失败,但在修复之后通过。
标签: java junit4 powermock easymock