Junit for java Clock没有任何额外的类或构造函数或者注入

问题描述 投票:1回答:1

我有以下方法

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的构造函数中初始化或不使用任何额外的实用程序类。

java java-8
1个回答
0
投票

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

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

Clock课程的重点是你可以做到这一点!整点是可以注入Clock,而像new Date()System.currentTimeMillis()这样的静态调用则不能。

如果您绝对必须测试使用静态方法的代码,Powermock或类似方法可能会对此有所帮助。在我看来,除了遗传代码,你的依赖关系你不能解开,这几乎从来没有必要。

© www.soinside.com 2019 - 2024. All rights reserved.