JUnit与Java8时钟
假设我们有一个我想测试的类:JUnit与Java8时钟,java,junit,java-8,java-time,Java,Junit,Java 8,Java Time,假设我们有一个我想测试的类: class Times { Clock cl = Clock.systemDefaultZone(); public int changeTime() { LocalDate ld = LocalDate.now(cl); if(ld.getMonth().equals(Month.OCTOBER)) return 1; if(ld.getMonth().equals(Mon
class Times {
Clock cl = Clock.systemDefaultZone();
public int changeTime() {
LocalDate ld = LocalDate.now(cl);
if(ld.getMonth().equals(Month.OCTOBER))
return 1;
if(ld.getMonth().equals(Month.NOVEMBER))
return 2;
return 0;
}
}
如何强制日期为11月,并断言该方法返回2
我正在使用JUnit和Mockito 假设
Times
类中有Clock
对象的setter,您可以执行如下操作:
Times times = new Times();
Clock fixedClockInNovember = Clock.fixed(Instant.parse("2015-11-01T00:00:00.00Z"), ZoneId.of("UTC"));
times.setClock(fixedClockInNovember);
assertEquals(2, times.changeTime());
在此代码中,创建了一个固定时钟。这将模拟给定时刻的恒定时间,即11月
因此,对
LocalDate.now(clock)
的任何调用都将始终在11月返回相同的日期。您可以使用相应的LocalDate工厂方法,例如:LocalDate.of(int year,int month,int dayOfMonth);因此,如果没有这个setter,我们就无法在时间类内更改时钟?你可以使用一点反射魔法,但你不能添加setter吗?@MichałWolnicki可能比setter更好(它允许将时钟更改为现有的和可能共享的时间实例-这很混乱)将时钟传递给构造函数。