我有以下方法
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的构造函数中初始化或没有使用任何额外的实用程序类的任何方法,都可以测试上述方法。
答案 0 :(得分:0)
我的建议是:甚至不要尝试这样做。静态访问几乎始终是可测试代码的障碍。不要通过静态方法获取您的Clock
。相反,请在此方法之外创建Clock.systemDefaultZone()
,然后将其作为方法参数注入,或通过构造函数/ setter注入将其注入到该方法的类中(正是您所说的那样!)
然后,您可以为单元测试提供任何Clock
。
Clock
类的重点是,您可以这样做!关键是可以注入Clock
,而不能注入new Date()
或System.currentTimeMillis()
之类的静态调用。
如果您绝对必须测试使用静态方法的代码,那么Powermock或类似方法可能会对此有所帮助。我认为,除了不能取消依赖的遗留代码外,这几乎是没有必要的。