gpt4 book ai didi

java - 用于 java Clock 的 Junit,无需任何额外的类、构造函数或注入(inject)

转载 作者:太空宇宙 更新时间:2023-11-04 10:06:17 26 4
gpt4 key购买 nike

我有以下方法

public long printDate(ZonedDateTime otherDate){
LocalDateTime ldt = LocalDateTime.now(Clock.systemDefaultZone());
ZonedDateTime now = ldt.atZone(ZoneId.of("America/New_York"));
Duration dur = Duration.between(otherDate, now);
long seconds = dur.getSeconds();
return seconds;
}

我想为此方法编写一个 Junit,但我不知道如何在不同时间模拟 Clock.fixed(...)

是否有任何方法可以在不使用 Clock 作为方法参数、不使用 Clock 构造函数中的初始化或不使用任何额外的实用程序类的情况下测试上述方法。

最佳答案

我的建议是:不要尝试这样做。静态访问几乎总是可测试代码的障碍。不要通过静态方法获取您的Clock。相反,在此方法之外创建 Clock.systemDefaultZone() ,并将其作为方法参数注入(inject),或通过构造函数/setter 注入(inject)到该方法的类中(正如您所说的您不想这样做!)

然后,您可以为单元测试提供您喜欢的任何Clock

Clock 类的全部意义在于让您可以做到这一点!重点是可以注入(inject) Clock,而 new Date()System.currentTimeMillis() 之类的静态调用则不能。

如果您绝对必须测试使用静态方法的代码,Powermock 或类似工具可能会有所帮助。在我看来,除了无法取消依赖关系的遗留代码之外,这几乎永远没有必要。

关于java - 用于 java Clock 的 Junit,无需任何额外的类、构造函数或注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52883801/

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