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

我不熟悉Mockito和JUnit,并尝试了解这些框架的基本单元测试。JUnit和Mockito中的大多数概念看起来简单易懂。然而,我在Mockito中遇到了超时问题。Mockito中的
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。