我是否可以延迟使用 Mockito 的存根方法响应



我现在正在编写单元测试。我需要使用 Mockito 模拟长期运行方法来测试我的实现的超时处理。莫吉托可以吗?

像这样:

when(mockedService.doSomething(a, b)).thenReturn(c).after(5000L);

您可以简单地将线程置于所需时间的睡眠状态。注意 - 这样的事情确实会减慢您的自动测试执行速度,因此您可能希望将此类测试隔离在单独的套件中

它看起来像这样:

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

从 mockito 2.8.44 开始,org.mockito.internal.stubbing.answers.AnswersWithDelay 可用于此目的。下面是一个示例用法

 doAnswer( new AnswersWithDelay( 1000,  new Returns("some-return-value")) ).when(myMock).myMockMethod();

我为此创建了一个实用程序:

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

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

doSleep(Duration.ofSeconds(3)).when(mock).method(anyObject());
when(mock.mockmethod(any)).delegate.thenAnswer(
new AnswersWithDelay(
 10000000, // nanosecond
 new Returns(
     Future.Successful(Right()),
 ),

莫基托-斯卡拉我用mockito Scala插件实现了它。它已经过测试,可以在指定时间睡觉

对于单元测试来说,更好的方法是创建调用实际 Thread.sleep(long l) 的方法,然后模拟该方法。有了它,您可以为您的测试注入很棒的行为,导致您的测试会认为它正在等待您想要的时间。有了它,您可以在眨眼间运行大量测试,并且仍然可以测试与时间相关的不同场景。在使用它之前,我的 UnitTest 运行了六分钟。现在不到 200 毫秒。

public class TimeTools {
public long msSince(long msStart) {
    return ((System.nanoTime() / 1_000_000) - msStart);
}
public long msNow() {
    return (System.nanoTime() / 1_000_000);
}
public Boolean napTime(long msSleep) throws InterruptedException {
    Thread.sleep(msSleep);
    return true;
}
}
-----------------------------------
@Mock
TimeTools Timetools;
@TEST
public void timeTest() {
when(timeTools.msSince(anyLong()))
            .thenReturn(0l)
            .thenReturn(5_500l)
            .thenReturn(11_000l)
            .thenReturn(11_000l)
            .thenReturn(0l)
            .thenReturn(11_000l)
            .thenReturn(11_000l)
            .thenReturn(0l)
            .thenReturn(29_000l);
}

但最好的方法是注入睡眠者,然后模拟它。所以在你的测试中,你实际上不会睡觉。然后,单元测试将像闪电一样快速运行。

相关内容

  • 没有找到相关文章

最新更新