Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JUnit与Java8时钟_Java_Junit_Java 8_Java Time - Fatal编程技术网

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更好(它允许将时钟更改为现有的和可能共享的时间实例-这很混乱)将时钟传递给构造函数。