【发布时间】:2019-03-13 06:53:04
【问题描述】:
我目前有一个要求,需要将 new Date() 模拟到所有测试用例的特定日期。
@Before
public void setUp() throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date NOW = sdf.parse("2015-09-26 00:00:00");
whenNew(Date.class).withAnyArguments().thenReturn(NOW);
}
所以我使用上面的代码来模拟它,但是当我看到测试结果的输出时,我仍然可以看到实际的“new Date()”被执行了。
所以我在所有测试文件的@before 块中添加了这个。那么你能帮忙看看我是否遗漏了什么吗?
【问题讨论】:
-
由于您使用的是 Java 8,因此首选方法是注入
Clock对象;这正是开发 API 的原因。 -
有关如何使用
Clock的更多信息,请参阅stackoverflow.com/questions/27067049/…,以便更轻松地进行单元测试。 -
据我了解,您正在测试的代码使用的是
Date。这是不幸的,因为该课程早已过时且设计不佳。您将需要改用java.time, the modern Java date and time API,。与它一起工作要好得多,尽管我当然无法判断你能负担得起迁移的速度。在众多不错的功能中,现代 API 对单元测试有很好的支持,因此您不再需要模拟。 -
在你不能替换
Date类但你可以使用Date.from(Instant.now(yourClockForTestingOrTheRealClock))的范围内。 -
A)我们需要minimal reproducible example B)很可能,您根本没有按照要求的步骤来模拟
new()...正如答案指出的那样,您只需要具体的事情让它工作(顺便说一句,这些都有很好的记录)
标签: java spring-boot java-8 mockito powermock