Mockito 超时如何工作?

How does Mockito timeout work?

我是 Mockito 和 JUnit 的新手,尝试了解这些框架的基本单元测试。 JUnit 和 Mockito 中的大多数概念看起来都很简单易懂。但是,我在 Mockito 中遇到了 timeouttimeout 在 Mockito 中的作用和在 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();
}

我预计两个测试都失败了。但只有 testJUnitTimeout() 失败了。为什么第二次测试通过?

非常感谢。

Verification with timeout 旨在用于验证操作是否已在指定超时内并发 调用。

它为并发操作提供有限形式的验证。

以下示例演示了该行为:

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