如何使用 JUnit 测试异步进程
2022-08-31 05:36:45
如何测试使用 JUnit 触发异步进程的方法?
我不知道如何让我的测试等待过程结束(它不完全是一个单元测试,它更像是一个集成测试,因为它涉及几个类而不仅仅是一个类)。
如何测试使用 JUnit 触发异步进程的方法?
我不知道如何让我的测试等待过程结束(它不完全是一个单元测试,它更像是一个集成测试,因为它涉及几个类而不仅仅是一个类)。
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