【问题标题】:How to mock LocalDateTime.now() in java 8如何在 Java 8 中模拟 LocalDateTime.now()
【发布时间】:2021-04-12 15:20:24
【问题描述】:

我正在测试一个使用 LocalDateTime.now() 的功能 ABC。

在方法 ABC 中,我将输入日期与 LocalDateTime.now() 进行比较

我希望我的测试在任何一天都能通过,所以我必须模拟 LocalDateTime.now()

这是我的测试:

public void testClass() {

       LocalDateTime mock = Mockito.mock(LocalDateTime.class);
       Mockito.doReturn(LocalDateTime.of(2030,01,01,22,22,22)).when(mock).now();

      log.info(String.valueOf(LocalDateTime.now()));

       myService.ABC();
}  

我正在使用 JAVA 8

控制台中显示的日期始终是真实的 LacalDateTime 而不是我想要的 LacalDateTime (2030-01-01)。

我没有收到错误。

有什么帮助吗?

【问题讨论】:

  • 如果可能,考虑反转依赖关系:您可以有一个包私有构造函数,该构造函数接受返回 LocalDateTime 的供应商,因此可以很容易地模拟(因此该单元使用 localDateTimeSupplier.get() 你有 LocalDateTime.now()目前)。现在您的单元似乎没有它,所以看起来您的测试必须非常了解单元内部结构才能使单元测试工作。模拟静态方法,尤其是那些没有从单元中暴露出来的方法,可能是一个非常错误的方法。
  • 仅供参考:Clock.fixed

标签: java testing mocking mockito powermockito


【解决方案1】:

对于这个用例,您应该使用Mockito#mockStatic

你可以这样使用它

try(MockedStatic<LocalDateTime> mock = Mockito.mockStatic(LocalDateTime.class, Mockito.CALLS_REAL_METHODS)) {
    doReturn(LocalDateTime.of(2030,01,01,22,22,22)).when(mock).now();
    // Put the execution of the test inside of the try, otherwise it won't work
}

注意Mockito.CALLS_REAL_METHODS 的用法,这将保证每当LocalDateTime 被另一个方法调用时,它将执行该类的真实方法。

【讨论】:

  • @mrts LocalDateTimejava.lang.System 有什么区别?
  • 抱歉,java.lang.Date 是在我的心理环境中,我只是看到它而不是 LocalDateTime你只看到你想看到的,正如麦当娜唱的...Date 构造函数在内部使用System.currentTimeMillis()。我会删除误导性评论。
  • @mrts 没问题,谢谢 :)
猜你喜欢
  • 2015-09-14
  • 2017-01-27
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
相关资源
最近更新 更多