我正在尝试测试使用CompletableFuture.allOf的方法。我模拟期货,以便它们在加入时返回所需的价值。由于某些我无法理解的原因。结果的join()需要永远。任何帮助都可以!
提前感谢。
@Mock private CompletableFuture<String> future1; // for sequence test
@Mock private CompletableFuture<String> future2; // for sequence test
@Mock private CompletableFuture<String> future3; // for sequence test
private BBService bbServiceTest;
@Test
public void testSequence() {
final String[] expectedResults = {"res1", "res2", "res3"};
List<CompletableFuture<String>> futures = new Vector<>();
when(future1.join()).thenReturn(expectedResults[0]);
when(future2.join()).thenReturn(expectedResults[1]);
when(future3.join()).thenReturn(expectedResults[2]);
futures.add(future1);
futures.add(future2);
futures.add(future3);
bbServiceTest.sequence(futures).join();
Assert.assertTrue(future1.isDone());
Assert.assertTrue(future2.isDone());
Assert.assertTrue(future3.isDone());
// for (int i = 0; i < actualResults.size(); i++) {
// Assert.assertEquals(expectedResults[i], actualResults.get(i));
// }
}
BBService中的顺序方法:
public <T> CompletableFuture<List<T>> sequence(List<CompletableFuture<T>> futuresList) {
return CompletableFuture
.allOf(futuresList.toArray(new CompletableFuture[0])) // (1)
.thenApply(v ->
futuresList.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList())
);
}
那是因为您的futures
从未完成。您可以通过thenApply
方法完成期货交易。但是,仅当所有期货均为completed
时才调用此方法。 CompletableFuture.allOf
返回一个新的CompletableFuture,当所有给定的CompletableFutures
完成时,该完成。
[future1.join()
,future2.join()
和future3.join()
从不被调用。