您如何测试使用 JUnit 触发异步进程的方法?
我不知道如何让我的测试等待进程结束(它不完全是一个单元测试,它更像是一个集成测试,因为它涉及多个类而不仅仅是一个)。
原文由 Sam 发布,翻译遵循 CC BY-SA 4.0 许可协议
您如何测试使用 JUnit 触发异步进程的方法?
我不知道如何让我的测试等待进程结束(它不完全是一个单元测试,它更像是一个集成测试,因为它涉及多个类而不仅仅是一个)。
原文由 Sam 发布,翻译遵循 CC BY-SA 4.0 许可协议
长话短说;博士; 不幸的是,目前还 没有 内置解决方案(在撰写本文时,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 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
恕我直言,让单元测试创建或等待线程等是不好的做法。您希望这些测试在几秒钟内运行。这就是为什么我想提出一种两步法来测试异步进程的原因。