I have a method:
public sendMessageAsync(final PublishRequest request) {
final CompletableFuture<PublishResponse> responseCompletableFuture = m_serviceAClient.publish(request);
responseCompletableFuture.whenCompleteAsync((response, exception) -> {
if (exception != null) {
try {
m_serviceBClient.sendMessage(request.getMessage())
} catch (Exception e) {
log.error("Failed to send message to fallback service.");
}
} else {
log.info("Successfully called service client");
}
}
return;
}
Unit test:
public void testsendMessageAsyncWhenServiceAThrowsException() {
CompletableFuture<PublishResponse> failedFuture = CompletableFuture.failedFuture(
new RuntimeException("Failed to publish message to Service A"));
doReturn(failedFuture).when(mockServiceAClient).publish(any(PublishRequest.class));
doReturn("message-id").when(mockServiceBClient).sendMessage(anyString());
MyClass.sendMessageAsync(new PublishRequest("test-message"));
}
I do not see the jacoco unit test coverage covering the line m_serviceBClient.sendMessage(request.getMessage())
.
I believe this is because by the time future callback handler executes, the junit test is already finished, so the code coverage tool doesn't detect the future callback statement coverage.