gpt4 book ai didi

unit-testing - 莫基托。捕获对 LocalDateTime.now() 的调用;

转载 作者:行者123 更新时间:2023-12-03 23:14:24 24 4
gpt4 key购买 nike

我正在做一个单元测试,它调用一个类并检查该类中的方法是否已使用某些参数调用。这些参数之一是 LocalDateTime.now() .

我的问题是,当时间控制回到我的 JUnit 测试时,时间已经过去了,所以如果我尝试将我正在调用的类中使用的时间与当前时间进行比较,它们不会匹配。

这是我正在研究的方法:

ServiceStatus serviceStatus = ServiceStatus.createNew(LocalDateTime.now());

Junit测试是:
verify(service).saveNotice(LocalDateTime.now));

我试过使用 TimeFactory确定日期:
given(timeFactory.currentDateTime()).willReturn(NOW);

其次是:
given(message.getHeader("MESSAGE_CREATED_TIME")).willReturn(NOW.toString());

&
verify(service).saveNotice(NOW));

但没有喜悦。

有什么建议么?

(PS。在实际代码中还有其他参数,但为了简单起见和商业 secret ,我已经把它们去掉了。)

最佳答案

不要使用 PowerMock。使用/模拟 Clock反而。将您的电话转至 LocalDateTime.now()LocalDateTime.now(clock) .从时钟文档:

Best practice for applications is to pass a Clock into any method that requires the current instant. A dependency injection framework is one way to achieve this:

public class MyBean {
private Clock clock; // dependency inject
...
public void process(LocalDate eventDate) {
if (eventDate.isBefore(LocalDate.now(clock)) {
...
}
}
}

This approach allows an alternate clock, such as fixed or offset to be used during testing.


一种策略是制作 clock final,并提供两个构造函数——一个使用提供的时钟,另一个从 Clock.systemDefaultZone() 中获取系统时钟。或 Clock.systemUTC() .另一种方法是使 Clock 字段可设置以进行测试,可能通过将其保留为包私有(private)。在任何一种情况下,您都可以通过提供由 Clock.fixed(...) 创建的时钟轻松覆盖该值。 ,或者如果您需要在测试期间进行更改,请编写您自己的实现。

关于unit-testing - 莫基托。捕获对 LocalDateTime.now() 的调用;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41574537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com