【问题标题】:How to mock new Date() in java using power mockito [closed]如何使用 power mockito 在 java 中模拟 new Date() [关闭]
【发布时间】: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


【解决方案1】:

被测类(new Date() 被调用)需要准备好进行测试(因为 PowerMockito 需要进行字节码操作以拦截构造函数调用)。

the documentation for the @PrepareForTest annotation

还有this page has a good overview on how to do this

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 2015-12-13
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多