Mockito超时如何工作?

时间:2015-07-14 05:03:52

标签: java junit timeout mockito

我是Mockito和JUnit的新手,并试图了解这些框架的基本单元测试。 JUnit和Mockito中的大多数概念都是直截了当且易于理解的。但是,我在Mockito遇到了timeout。 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();
}

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

非常感谢。

1 个答案:

答案 0 :(得分:4)

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