如何测试异步方法

时间:2019-06-06 09:33:51

标签: java asynchronous completable-future

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

此刻我的代码如下:

@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应该默认在自己的线程中运行?

1 个答案:

答案 0 :(得分:3)

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