java - 使用 Junit 测试时如何停止 main 方法调用 sleep() 方法?

标签 java unit-testing junit mockito thread-sleep

我正在测试一个包含 sleep 的方法。停止调用 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。它可以是被测试类的属性。

sleep(ofSeconds(getSleepInternval()));

在测试中会调用

testedObject.setSleepInterval(0);

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

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

在你的类里面你会

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);

关于java - 使用 Junit 测试时如何停止 main 方法调用 sleep() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63315778/

相关文章:

java - Android GridView 可二维滚动

java - IBM websphere 8.0 中带有嵌套异常 java.lang.LinkageError 的 BeanCreationException

java - 将 junit 测试加载到不同的 jvm

email - 如何在 Jenkins 电子邮件报告中呈现单元测试图?

java - 通过引用其他测试套件从测试套件执行 Junit4 测试

java - SQL异常 : No suitable driver found for url=jdbc:derby

java - 为什么会出现GXT异常以及如何修复?

c++ - 重构 protected 基类依赖以进行测试

cocoa-touch - 更改 Cocoa 单元测试的系统日期

c# - 在 C# 中使用 Assert.AreEqual() 比较字符串时何时传递 Culture