使用 Junit 测试时如何停止调用 sleep() 方法的主要方法?

How to stop main method calling sleep() method, when testing it with Junit?

我正在测试一个包含 sleep in side 的方法 it.What 是停止调用 sleep() 的方法,因为它会使测试变慢??

  public void fun(Integer timeToWait) {
    TimeLimiter timeLimiter = new SimpleTimeLimiter();
    try {
      timeLimiter.callWithTimeout(() -> {
        while (true) {
          if (avrageIsAboveThanDesired) {
            return true;
          }
          sleep(ofSeconds(REQUEST_STATUS_CHECK_INTERVAL));
        }
      }, timeToWait, TimeUnit.MINUTES, true);
    } catch (UncheckedTimeoutException e) {
      logger.error("Timed out waiting Instances to be in Running State", e);
    } catch (WingsException e) {
      throw e;
    } catch (Exception e) {
      throw new InvalidRequestException("Error while waiting Instaces to be in Running State", e);
    }
  }

没有简单的方法可以做到这一点。您有多种选择。

最简单的方法是使 REQUEST_STATUS_CHECK_INTERVAL 可配置并在测试中将其配置为 0。它可以是测试的 class.

的 属性
sleep(ofSeconds(getSleepInternval()));

在测试中会调用

testedObject.setSleepInterval(0);

第二个选项是将 sleep 调用提取到它自己的可以被模拟的 class 中。

class Sleeper {
   void sleep(long milisecs) {
     Thread.sleep(milisecs);
   }
}

在你的class中你会

private Sleeper sleeper = new Sleeper(); //nd it's setter, or dependency injection

函数中

sleeper.sleep(ofSeconds(REQUEST_STATUS_CHECK_INTERVAL));

这是你可以做的测试

Sleeper mockedSleeper = Mockito.mock(Sleeper.class);
testedObject.setSleeper(mockedSleeper);