Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何测试异步方法_Java_Asynchronous_Completable Future - Fatal编程技术网

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()
为空,则表示“执行一些逻辑以获取数据”返回的数据为空。你能提供一个重现问题的方法吗?