如何使用JUnit测试异步进程

新手上路,请多包涵

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

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

原文由 Sam 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

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

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

原文由 Cem Catikkas 发布,翻译遵循 CC BY-SA 2.5 许可协议

长话短说;博士; 不幸的是,目前还 没有 内置解决方案(在撰写本文时,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 的 这篇 博文。

由于@jtahlborn 和@Ring 的评论, 编辑 删除了 CountDownLatch 周围的同步块

原文由 Martin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题