Java 如何测试异步方法
我需要从数据库中异步获取一些数据,然后同步更新当前缓存的数据,其中一个是已获取的数据 目前,我的代码如下所示:Java 如何测试异步方法,java,asynchronous,completable-future,Java,Asynchronous,Completable Future,我需要从数据库中异步获取一些数据,然后同步更新当前缓存的数据,其中一个是已获取的数据 目前,我的代码如下所示: @Asynchronous public void fetchData() { CompletableFuture.supplyAsync(() -> { //Do some logic to fetch data return fetchedData; }).thenAccept(fetchedData -> updateC
@Asynchronous
public void fetchData() {
CompletableFuture.supplyAsync(() -> {
//Do some logic to fetch data
return fetchedData;
}).thenAccept(fetchedData -> updateCache(fetchedData));
}
我的问题是,当我在测试中调用此方法时,它会立即转到然后接受,但获取的数据为空。我试图更改我的方法,并返回CompletableFuture
,并在测试中调用fetchData().join()
。它工作得很好,但首先-我的应用程序不会构建,因为@Asynchronous
需要返回Future
或void
,我不认为仅仅为了测试而更改方法是个好主意。
我听说了Wait库,但不能在当前项目中使用它
我也不确定,我的情况是否需要@Asynchronous
?如果我没有弄错的话,CompletableFuture
默认情况下应该在自己的线程中运行?Jacek,我认为不需要@Asynchronous注释。你可以使用完全未来的纯形式。我在下面提供了基于您提供的代码的示例代码
public String getInfoFromDB() {
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Data from DB";
}
public void updateCache(String dataFromDB) {
System.out.println("Data from D : " + dataFromDB);
System.out.println("Doing some operations with data from DB");
}
public void fetchData() {
CompletableFuture cf =
CompletableFuture.supplyAsync(() -> getInfoFromDB())
.thenAccept(dataFromDB -> updateCache(dataFromDB));
cf.join();
}
不需要使用@Asynchronous
和CompletableFuture
这没有什么意义<如果返回的fetchedData
为空,则只有在返回fetchedData
后才会执行code>thenapt
。如果fetchedData
中的thenapt()
为空,则表示“执行一些逻辑以获取数据”返回的数据为空。你能提供一个重现问题的方法吗?