如何使用 JUnit 测试异步进程

2022-08-31 05:36:45

如何测试使用 JUnit 触发异步进程的方法?

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


答案 1

TL;DR;不幸的是,还没有内置的解决方案(在撰写本文时,2022年),因此您可以自由使用和/或实现适合您情况的任何内容。

另一种方法是使用 CountDownLatch 类。

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

注意:您不能只使用与常规对象同步作为锁,因为快速回调可以在调用锁的等待方法之前释放锁。请参阅Joe Walnes的这篇博客文章。

编辑删除了CountDownLatch周围的同步块,这要归功于@jtahlborn和@Ring


答案 2

您可以尝试使用 Awaitility 库。它使测试您正在谈论的系统变得容易。


推荐