Add unit test to resolve multiple CompletableFutures
This commit is contained in:
		
							parent
							
								
									8746cae8c0
								
							
						
					
					
						commit
						c90eac4ac5
					
				| @ -60,8 +60,8 @@ | |||||||
|                 <version>3.1</version> |                 <version>3.1</version> | ||||||
|                 <configuration> |                 <configuration> | ||||||
|                     <compilerVersion>${javac.target}</compilerVersion> |                     <compilerVersion>${javac.target}</compilerVersion> | ||||||
|                     <source>${java.version}</source> |                     <source>9</source> | ||||||
|                     <target>${java.version}</target> |                     <target>9</target> | ||||||
|                 </configuration> |                 </configuration> | ||||||
|             </plugin> |             </plugin> | ||||||
|             <plugin> |             <plugin> | ||||||
|  | |||||||
| @ -0,0 +1,62 @@ | |||||||
|  | package com.baeldung.concurrent.completablefuture; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertEquals; | ||||||
|  | import static org.mockito.ArgumentMatchers.any; | ||||||
|  | import static org.mockito.Mockito.mock; | ||||||
|  | import static org.mockito.Mockito.when; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Collections; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.concurrent.CompletableFuture; | ||||||
|  | import java.util.concurrent.ExecutionException; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | import java.util.stream.Stream; | ||||||
|  | 
 | ||||||
|  | import org.junit.Test; | ||||||
|  | import org.junit.jupiter.params.ParameterizedTest; | ||||||
|  | import org.junit.jupiter.params.provider.Arguments; | ||||||
|  | import org.junit.jupiter.params.provider.MethodSource; | ||||||
|  | 
 | ||||||
|  | public class CombiningCompletableFuturesUnitTest { | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenMicroserviceClient_whenCreateResource_thenReturnSuccess() throws ExecutionException, InterruptedException { | ||||||
|  |         MicroserviceClient mockMicroserviceA = mock(MicroserviceClient.class); | ||||||
|  |         when(mockMicroserviceA.createResource(any())).thenReturn(CompletableFuture.completedFuture(123L)); | ||||||
|  |         CompletableFuture<Long> resultFuture = mockMicroserviceA.createResource("My Resource"); | ||||||
|  |         assertEquals(123L, resultFuture.get()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private static Stream<Arguments> givenMicroserviceClient_whenMultipleCreateResource_thenCombineResults() { | ||||||
|  |         return Stream.of( | ||||||
|  |             Arguments.of(List.of("Good Resource"), 1, 0), | ||||||
|  |             Arguments.of(List.of("Bad Resource"), 0, 1), | ||||||
|  |             Arguments.of(List.of("Good Resource", "Bad Resource"), 1, 1), | ||||||
|  |             Arguments.of(List.of("Good Resource", "Bad Resource", "Good Resource", "Bad Resource", "Good Resource"), 3, 2) | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @ParameterizedTest | ||||||
|  |     @MethodSource | ||||||
|  |     public void givenMicroserviceClient_whenMultipleCreateResource_thenCombineResults(List<String> inputs, int expectedSuccess, int expectedFailure) throws ExecutionException, InterruptedException { | ||||||
|  |         MicroserviceClient mockMicroservice = mock(MicroserviceClient.class); | ||||||
|  |         when(mockMicroservice.createResource("Good Resource")).thenReturn(CompletableFuture.completedFuture(123L)); | ||||||
|  |         when(mockMicroservice.createResource("Bad Resource")).thenReturn(CompletableFuture.failedFuture(new IllegalArgumentException("Bad Resource"))); | ||||||
|  | 
 | ||||||
|  |         List<CompletableFuture<Long>> clientCalls = new ArrayList<>(); | ||||||
|  |         for (String resource : inputs) { | ||||||
|  |             clientCalls.add(mockMicroservice.createResource(resource)); | ||||||
|  |         } | ||||||
|  |         CompletableFuture.allOf(clientCalls.toArray(new CompletableFuture[inputs.size()])).exceptionally(ex -> null).join(); | ||||||
|  |         Map<Boolean, List<CompletableFuture<Long>>> resultsByFailure = clientCalls.stream().collect(Collectors.partitioningBy(CompletableFuture::isCompletedExceptionally)); | ||||||
|  |         assertThat(resultsByFailure.getOrDefault(false, Collections.emptyList()).size()).isEqualTo(expectedSuccess); | ||||||
|  |         assertThat(resultsByFailure.getOrDefault(true, Collections.emptyList()).size()).isEqualTo(expectedFailure); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     interface MicroserviceClient { | ||||||
|  |         CompletableFuture<Long> createResource(String resourceName); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user