我可以延迟使用Mockito的方法响应吗?

52 java junit mocking mockito

我现在正在编写单元测试.我需要用Mockito模拟长期方法来测试我的实现的超时处理.Mockito可以吗?

像这样的东西:

when(mockedService.doSomething(a, b)).thenReturn(c).after(5000L);
Run Code Online (Sandbox Code Playgroud)

K.L*_*.L. 59

你可以简单地让线程休眠一段时间.注意这一点 - 这样的事情确实会减慢您的自动化测试执行速度,因此您可能希望在单独的套件中隔离这些测试

它看起来与此类似:

when(mock.load("a")).thenAnswer(new Answer<String>() {
   @Override
   public String answer(InvocationOnMock invocation){
     Thread.sleep(5000);
     return "ABCD1234";
   }
});
Run Code Online (Sandbox Code Playgroud)

  • 第一次使用参数"a"调用mock.load将被存根,结果将被"缓存".因此后续调用将不会通过回答,并且Thread.sleep将不会被执行. (5认同)
  • 见@Viswanath [2018 答案](/sf/answers/3537118301/) (3认同)
  • 好,对我来说很清楚 但是,是否存在任何Mockito功能可用于执行此类操作? (2认同)

Vis*_*ath 12

从嘲笑2.8.44起,org.mockito.internal.stubbing.answers.AnswersWithDelay可用于此目的。这是一个示例用法

 doAnswer( new AnswersWithDelay( 1000,  new Returns("some-return-value")) ).when(myMock).myMockMethod();
Run Code Online (Sandbox Code Playgroud)

  • 如果方法返回 void ,这将如何工作?可能使用类似于 https://www.javatips.net/api/org.mockito.additionalanswers.answervoid 的 `answerVoid()` ? (4认同)
  • [此](/sf/answers/4159854891/)答案使用工厂类“AdditionalAnswers.answersWithDelay()”,这是正确的方法,因为“AnswersWithDelay”是内部类。 (4认同)

Sim*_*wig 9

我为此创建了一个utils:

import java.time.Duration;
import java.util.concurrent.TimeUnit;

import static org.mockito.Mockito.doAnswer;

public class Stubber {

    public static org.mockito.stubbing.Stubber doSleep(Duration timeUnit) {
        return doAnswer(invocationOnMock -> {
            TimeUnit.MILLISECONDS.sleep(timeUnit.toMillis());
            return null;
        });
    }

    public static <E> org.mockito.stubbing.Stubber doSleep(Duration timeUnit, E ret) {
        return doAnswer(invocationOnMock -> {
            TimeUnit.MILLISECONDS.sleep(timeUnit.toMillis());
            return ret;
        });
    }

}
Run Code Online (Sandbox Code Playgroud)

在您的测试用例中只需使用:

doSleep(Duration.ofSeconds(3)).when(mock).method(anyObject());
Run Code Online (Sandbox Code Playgroud)