Java Mockito超时是如何工作的?
我不熟悉Mockito和JUnit,并尝试了解这些框架的基本单元测试。JUnit和Mockito中的大多数概念看起来简单易懂。然而,我在Mockito中遇到了超时问题。Mockito中的Java Mockito超时是如何工作的?,java,junit,timeout,mockito,Java,Junit,Timeout,Mockito,我不熟悉Mockito和JUnit,并尝试了解这些框架的基本单元测试。JUnit和Mockito中的大多数概念看起来简单易懂。然而,我在Mockito中遇到了超时问题。Mockito中的timeout与JUnit中的作用相同吗?下面是我的密码 @Mock Timeoutable timeoutable; @Test(timeout = 100) public void testJUnitTimeout() { try { Thread.sleep(2000);
timeout
与JUnit中的作用相同吗?下面是我的密码
@Mock Timeoutable timeoutable;
@Test(timeout = 100)
public void testJUnitTimeout() {
try {
Thread.sleep(2000);
} catch (InterruptedException ie) {
}
}
@Test
public void testMockitoTimeout(){
doAnswer(new Answer() {
@Override public Object answer(InvocationOnMock invocation){
try {
Thread.sleep(1000);
} catch (InterruptedException ie){
}
return null;
}
}).when(timeoutable).longOperation();
timeoutable.longOperation();
verify(timeoutable, timeout(100)).longOperation();
}
我原以为两次测试都失败了。但只有testjunitimeout()
失败。为什么第二次考试通过了
非常感谢。用于验证操作是否在指定的超时时间内被同时调用
它为并发操作提供了一种有限形式的验证
以下示例演示了该行为:
private final Runnable asyncOperation = new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
timeoutable.longOperation();
} catch (InterruptedException e) {
}
}
};
@Test
public void testMockitoConcurrentTimeoutSucceeds(){
new Thread(asyncOperation).start();
verify(timeoutable, timeout(2000)).longOperation();
}
@Test
public void testMockitoConcurrentTimeoutFails(){
new Thread(asyncOperation).start();
verify(timeoutable, timeout(100)).longOperation();
}
在第二种方法中,
timeoutable
的值是多少?您确定正在执行Thread.sleep(1000)
调用吗?@TimBiegeleisen:timeoutable
只是我编写的timeoutable接口的模拟对象,只是为了测试。你能在调试模式下运行你的单元测试吗?我怀疑Thread.sleep()
调用在第二次测试中从未执行过。我已尝试在调试模式下运行。Thread.sleep()
实际上按预期调用。我怀疑执行doAnswer
和其他类似存根方法的时间没有计入超时计数。如果您有任何解释,请随时回答您自己的问题。嗨,Steve,您的代码在超时时工作正常。你能解释一下为什么我的代码不起作用吗?ThanksMy代码正在调用timeoutable.longOperation()代码>在与测试不同的线程中,而您的不是。我刚刚通过放置timeoutable.longOperation()更改了您的代码代码>在线程之前。睡眠(1000)
。然后两个测试都通过了。因此,我推断verify
实际上等待timeout
持续时间,在该持续时间内,如果调用longOperation()
,则测试通过。它不测量实际执行longOperation()
的时间。我的推断正确吗?没错-阅读我帖子开头的链接(我刚刚修复了链接)。这也很好地说明了如何使用timeout()VerificationWithTimeout VerificationMode。