Added test for the Guide to CompletableFuture (#611)
This commit is contained in:
parent
2f331cecf8
commit
5195a4310e
|
@ -0,0 +1,196 @@
|
||||||
|
package com.baeldung.completablefuture;
|
||||||
|
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
public class CompletableFutureTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenRunningCompletableFutureAsyncronously_thenGetMethodWaitsForResult() throws InterruptedException, ExecutionException {
|
||||||
|
|
||||||
|
Future<String> completableFuture = calculateAsync();
|
||||||
|
|
||||||
|
String result = completableFuture.get();
|
||||||
|
assertEquals("Hello", result);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Future<String> calculateAsync() throws InterruptedException {
|
||||||
|
CompletableFuture<String> completableFuture = new CompletableFuture<>();
|
||||||
|
|
||||||
|
Executors.newCachedThreadPool().submit(() -> {
|
||||||
|
Thread.sleep(500);
|
||||||
|
completableFuture.complete("Hello");
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
|
return completableFuture;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenRunningCompletableFutureWithResult_thenGetMethodReturnsImmediately() throws InterruptedException, ExecutionException {
|
||||||
|
|
||||||
|
Future<String> completableFuture = CompletableFuture.completedFuture("Hello");
|
||||||
|
|
||||||
|
String result = completableFuture.get();
|
||||||
|
assertEquals("Hello", result);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCreatingCompletableFutureWithSupplyAsync_thenFutureReturnsValue() throws ExecutionException, InterruptedException {
|
||||||
|
|
||||||
|
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
|
||||||
|
|
||||||
|
assertEquals("Hello", future.get());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenAddingThenAcceptToFuture_thenFunctionExecutesAfterComputationIsFinished() throws ExecutionException, InterruptedException {
|
||||||
|
|
||||||
|
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> "Hello");
|
||||||
|
|
||||||
|
CompletableFuture<Void> future = completableFuture.thenAccept(s -> System.out.println("Computation returned: " + s));
|
||||||
|
|
||||||
|
future.get();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenAddingThenRunToFuture_thenFunctionExecutesAfterComputationIsFinished() throws ExecutionException, InterruptedException {
|
||||||
|
|
||||||
|
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> "Hello");
|
||||||
|
|
||||||
|
CompletableFuture<Void> future = completableFuture.thenRun(() -> System.out.println("Computation finished."));
|
||||||
|
|
||||||
|
future.get();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenAddingThenApplyToFuture_thenFunctionExecutesAfterComputationIsFinished() throws ExecutionException, InterruptedException {
|
||||||
|
|
||||||
|
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> "Hello");
|
||||||
|
|
||||||
|
CompletableFuture<String> future = completableFuture.thenApply(s -> s + " World");
|
||||||
|
|
||||||
|
assertEquals("Hello World", future.get());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingThenCompose_thenFuturesExecuteSequentially() throws ExecutionException, InterruptedException {
|
||||||
|
|
||||||
|
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> "Hello")
|
||||||
|
.thenCompose(s -> CompletableFuture.supplyAsync(() -> s + " World"));
|
||||||
|
|
||||||
|
assertEquals("Hello World", completableFuture.get());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingThenCombine_thenWaitForExecutionOfBothFutures() throws ExecutionException, InterruptedException {
|
||||||
|
|
||||||
|
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> "Hello")
|
||||||
|
.thenCombine(CompletableFuture.supplyAsync(() -> " World"),
|
||||||
|
(s1, s2) -> s1 + s2);
|
||||||
|
|
||||||
|
assertEquals("Hello World", completableFuture.get());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenUsingThenAcceptBoth_thenWaitForExecutionOfBothFutures() throws ExecutionException, InterruptedException {
|
||||||
|
|
||||||
|
CompletableFuture.supplyAsync(() -> "Hello")
|
||||||
|
.thenAcceptBoth(CompletableFuture.supplyAsync(() -> " World"),
|
||||||
|
(s1, s2) -> System.out.println(s1 + s2));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFutureCombinedWithAllOfCompletes_thenAllFuturesAreDone() throws ExecutionException, InterruptedException {
|
||||||
|
|
||||||
|
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
|
||||||
|
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "Beautiful");
|
||||||
|
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> "World");
|
||||||
|
|
||||||
|
CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2, future3);
|
||||||
|
|
||||||
|
// ...
|
||||||
|
|
||||||
|
combinedFuture.get();
|
||||||
|
|
||||||
|
assertTrue(future1.isDone());
|
||||||
|
assertTrue(future2.isDone());
|
||||||
|
assertTrue(future3.isDone());
|
||||||
|
|
||||||
|
String combined = Stream.of(future1, future2, future3)
|
||||||
|
.map(CompletableFuture::join)
|
||||||
|
.collect(Collectors.joining(" "));
|
||||||
|
|
||||||
|
assertEquals("Hello Beautiful World", combined);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenFutureThrows_thenHandleMethodRecievesException() throws ExecutionException, InterruptedException {
|
||||||
|
|
||||||
|
String name = null;
|
||||||
|
|
||||||
|
// ...
|
||||||
|
|
||||||
|
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
|
||||||
|
if (name == null) {
|
||||||
|
throw new RuntimeException("Computation error!");
|
||||||
|
}
|
||||||
|
return "Hello, " + name;
|
||||||
|
}).handle((s, t) -> {
|
||||||
|
if (s != null) {
|
||||||
|
return s;
|
||||||
|
} else {
|
||||||
|
return "Hello, Stranger!";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assertEquals("Hello, Stranger!", completableFuture.get());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = ExecutionException.class)
|
||||||
|
public void whenCompletingFutureExceptionally_thenGetMethodThrows() throws ExecutionException, InterruptedException {
|
||||||
|
|
||||||
|
CompletableFuture<String> completableFuture = new CompletableFuture<>();
|
||||||
|
|
||||||
|
// ...
|
||||||
|
|
||||||
|
completableFuture.completeExceptionally(new RuntimeException("Calculation failed!"));
|
||||||
|
|
||||||
|
// ...
|
||||||
|
|
||||||
|
completableFuture.get();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenAddingThenApplyAsyncToFuture_thenFunctionExecutesAfterComputationIsFinished() throws ExecutionException, InterruptedException {
|
||||||
|
|
||||||
|
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> "Hello");
|
||||||
|
|
||||||
|
CompletableFuture<String> future = completableFuture.thenApplyAsync(s -> s + " World");
|
||||||
|
|
||||||
|
assertEquals("Hello World", future.get());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue