Junit for Java Clock,无需任何额外的类或构造函数或注入

时间:2018-10-18 23:12:00

标签: java java-8

我有以下方法

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的构造函数中初始化或没有使用任何额外的实用程序类的任何方法,都可以测试上述方法。

1 个答案:

答案 0 :(得分:0)

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

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

Clock类的重点是,您可以这样做!关键是可以注入Clock,而不能注入new Date()System.currentTimeMillis()之类的静态调用。

如果您绝对必须测试使用静态方法的代码,那么Powermock或类似方法可能会对此有所帮助。我认为,除了不能取消依赖的遗留代码外,这几乎是没有必要的。