测试需要很长时间才能执行的方法

时间:2018-03-14 13:02:08

标签: java

假设我有这样的方法:

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天,但我的问题是,是否有方法来模拟这个时间流逝。

与使用虚拟时间https://projectreactor.io/docs/test/snapshot/api/reactor/test/StepVerifier.html#withVirtualTime-java.util.function.Supplier-

的项目反应堆方法类似

3 个答案:

答案 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);
}