如何在单元测试中验证方法是否将异步执行,即在单独的线程中



以下方法同步调用service的方法serveThis(),并在单独的线程中(即异步)serveThat()该方法:

public void doSomething() {
    service.serveThis();
    new Thread(() -> service.serveThat()).start();
}

我想在单元测试中验证service.serveThat()将异步执行,因为根据规范,它不能同步执行。所以,我想防止以后有人只是删除启动这样的新线程:

public void doSomething() {
    service.serveThis();
    // This synchronous execution must cause the test to fail
    service.serveThat();
}

我想验证service.serveThat()是否将异步执行。

会的。语法是这样说的。不要测试平台。

可以在

代码中的任何位置获取Thread.currentThread(),因此您可以编写类似的东西并基于它进行断言(如果您没有YourInterface,您可以使用 Mockito 以不同的方式实现这一点):

public class ThreadChecker implements YourInterface {
    volatile Thread serveThisThread;
    volatile Thread serveThatThread;
    public void serveThis() {
        serveThisThread = Thread.currentThread();
    }
    public void serveThat() {
        serveThatThread = Thread.currentThread();
    }
}

单元测试可以是这样的,但根据用例可能需要其他断言:

ThreadChecker mockService = new ThreadChecker(); 
@Test
public void serveThatWillBeExecutedAsynchronously() throws Exception {
    doSomething();
    TestCase.assertFalse(mockService.serveThatThread == mockService.serveThisThread);
}

为了实现这一点,我使用Mockito:

Thread threadServeThatRunsOn;
@Test
public void serveThatWillBeExecutedAsynchronously() throws Exception {
    doAnswer(invocation -> {
        threadServeThatRunsOn = Thread.currentThread();
        return null;
    }).when(mockService).serveThat();
    testObject.doSomething();
    verify(mockService, timeout(200)).serveThat();
    assertNotEquals(threadServeThatRunsOn, Thread.currentThread());
}

现在,如果有人修改doSomething()以便service.serveThat()同步运行,那么此测试将失败。

相关内容

  • 没有找到相关文章

最新更新