假设我有这样的方法:
public int toTest() {
try { Thread.sleep(60 * 1_000); }
catch (InterruptedException ignored) {}
return 8;
}
我想测试它,例如检查返回的值是否正确,如下所示:
@Test
public void test() {
int actual = toTest();
assertThat(actual).isEqualTo(8);
}
有没有办法“模拟”时间流逝,所以在测试执行过程中,我不会被迫等待整整一分钟?
编辑: 可能我描述的问题太具体了。我不想专注于这一分钟,但是想要绕过它。可能甚至有100天,但我的问题是,是否有方法来模拟这个时间流逝。
的项目反应堆方法类似答案 0 :(得分:1)
您可以使用Powermock实现这一目标。
// This will mock sleep method
PowerMock.mockStatic(Thread.class, methods(Thread.class, "sleep"));
PowerMockito.doThrow(new InterruptedException()).when(Thread.class);
Thread.sleep(Mockito.anyLong());
在课程开始时,您需要添加此
@PrepareForTest(YourClassToWhich_ToTest_MethodBelong.class)
答案 1 :(得分:0)
JUnit按原样测试方法(除非你添加模拟..)如果你想要你可以测试内部方法为toTestInternal
:
public int toTest() {
try { Thread.sleep(60 * 1_000); }
catch (InterruptedException ignored) {}
return toTestInternal();
}
public int toTestInternal() {
return 8;
}
并测试您想要的方法(toTestInternal
):
@Test
public void test() {
int actual = toTestInternal();
assertThat(actual).isEqualTo(8);
}
答案 2 :(得分:0)
我建议将间隔设为动态参数。它会节省您的时间:
public int toTest(int interval) {
try {
Thread.sleep(interval);
}catch (InterruptedException ignored) {}
return 8;
}
和测试类如下:
@Test
public void test() {
int actual = toTest(60);
assertThat(actual).isEqualTo(8);
}