gpt4 book ai didi

java - 如何测试异步方法

转载 作者:行者123 更新时间:2023-11-29 04:08:46 25 4
gpt4 key购买 nike

我需要从数据库异步获取一些数据,然后用获取的数据同步更新当前缓存的数据。

目前我的代码是这样的:

@Asynchronous
public void fetchData() {
CompletableFuture.supplyAsync(() -> {
//Do some logic to fetch data
return fetchedData;
}).thenAccept(fetchedData -> updateCache(fetchedData));
}

我的问题是,当我在测试中调用此方法时,它会立即转到 thenAccept但是fetchedData是空的。我试图改变我的方法,并返回 CompletableFuture<List<Data>> , 并调用 fetchData().join()在测试中。它工作正常,但首先 - 我的应用程序无法构建,因为 @Asynchronous需要返回Futurevoid ,而且我认为改变方法只是为了测试它不是一个好主意。我听说过 Await 库,但不能在当前项目中使用它。

我也不确定,如果 @Asynchronous在我的情况下需要吗?如果我没记错的话,CompletableFuture默认情况下应该在自己的线程中运行吗?

最佳答案

Jacek,我认为不需要@Asynchronous 注释。您可以使用可完成 future 的纯粹形式。我在下面提供了基于您提供的代码的示例代码。

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

关于java - 如何测试异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56474757/

25 4 0
文章推荐: java - 如何从 ConstraintViolationException 获取查询参数名称
文章推荐: java - 有没有办法将格式化的 BigDecimal 数字分配给 BigDecimal?
文章推荐: java - 当我们在 Spring Boot 中使用 JPA Repository 时,List 默认大小是多少?