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

时间:2017-10-31 10:06:24

标签: java mockito awaitility

以下方法在一个单独的线程中同步调用serveThis()的{​​{1}}方法和service方法,即异步调用:

serveThat()

我想在单元测试中验证public void doSomething() { service.serveThis(); new Thread(() -> service.serveThat()).start(); } 将根据规范异步执行,它不能同步执行。 所以,我想要防止以后某人只是删除开始这样的新线程:

service.serveThat()

3 个答案:

答案 0 :(得分:1)

可以在代码中的任何位置获得Thread.currentThread(),因此您可以编写类似这样的内容并根据它创建断言(如果您没有{{1,可以通过Mockito以不同的方式实现此目的) }}):

YourInterface

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

public class ThreadChecker implements YourInterface {

    volatile Thread serveThisThread;
    volatile Thread serveThatThread;

    public void serveThis() {
        serveThisThread = Thread.currentThread();
    }

    public void serveThat() {
        serveThatThread = Thread.currentThread();
    }
}

答案 1 :(得分:0)

  

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

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

答案 2 :(得分:-1)

为了达到这个目的,我使用了Mockito:

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

现在,如果有人修改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()同步运行,则此测试将失败。