正在测试CompletableFuture.allOf。加入需要永远

问题描述 投票:0回答:1

我正在尝试测试使用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())
                );
    }

java junit mockito completable-future
1个回答
0
投票

那是因为您的futures从未完成。您可以通过thenApply方法完成期货交易。但是,仅当所有期货均为completed时才调用此方法。 CompletableFuture.allOf返回一个新的CompletableFuture,当所有给定的CompletableFutures完成时,该完成。

[future1.join()future2.join()future3.join()从不被调用。

© www.soinside.com 2019 - 2024. All rights reserved.