如何使用Junit测试异步进程

问题

如何测试使用Junit激发异步进程的方法?

我不知道如何让我的测试等待进程结束(它不是一个单元测试,它更像是一个集成测试,因为它涉及几个类而不仅仅是一个)


#1 热门回答(144 赞)

另一种方法是使用9950505921类。

public class DatabaseTest {

    /**
     * Data limit
     */
    private static final int DATA_LIMIT = 5;

    /**
     * Countdown latch
     */
    private CountDownLatch lock = new CountDownLatch(1);

    /**
     * Received data
     */
    private List<Data> receiveddata;

    @Test
    public void testDataRetrieval() throws Exception {
        Database db = new MockDatabaseImpl();
        db.getData(DATA_LIMIT, new DataCallback() {
            @Override
            public void onSuccess(List<Data> data) {
                receiveddata = data;
                lock.countDown();
            }
        });

        lock.await(2000, TimeUnit.MILLISECONDS);

        assertNotNull(receiveddata);
        assertEquals(DATA_LIMIT, receiveddata.size());
    }
}

注意你不能只使用同步化与常规对象作为锁,因为快速回调可以在调用lock的wait方法之前释放锁。见Joe Walnes的thisblog帖子。

编辑感谢来自@jtahlborn和@Ring的评论,在CountDownLatch周围移除了同步块


#2 热门回答(55 赞)

你可以尝试使用Awaitilitylibrary。它可以轻松测试你正在谈论的系统。


#3 热门回答(40 赞)

恕我直言,让单元测试创​​建或等待线程等是不好的做法。你希望这些测试在几秒钟内运行。这就是为什么我想提出一个两步测试异步过程的方法。

  • 测试你的异步过程是否正确提交。你可以模拟接受异步请求的对象,并确保提交的作业具有正确的属性等。
  • 测试你的异步回调正在做正确的事情。在这里,你可以模拟最初提交的作业并假设它已正确初始化并验证你的回调是否正确。