Is there a way to have mockito throw an exception on the CompletableFuture.get()
call and not just the asynchronous method?
For example, given the following (incorrect) test case:
@Test
public void whenRunnerThrows_thenReturn5xx() throws Exception {
when(service.runAsync(any(),any())).thenThrow(new Exception(""));
mvc.perform(post("/test")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"name\":\"test\"}"))
.andExpect(status().is5xxServerError());
}
When service.runAsync()
is called during testing, an exception is thrown, which makes sense. But when the (Spring Boot) application is run, then the same exception will only be thrown as a an ExecutionException
cause on the returned CompletableFuture::get
.
What is the correct way to write a test like this one so that the exception is thrown at the same time in unit testing as it is when running the application?
As Sotirios pointed out, you can create a CompletableFuture
and have it complete with the exception. Here's the code for reference to others:
@Test
public void whenRunnerThrows_thenReturn5xx() throws Exception {
CompletableFuture<String> badFuture = new CompletableFuture<>();
badFuture.completeExceptionally(new Exception(""));
when(service.runAsync(any(),any())).thenReturn(badFuture);
mvc.perform(post("/test")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"name\":\"test\"}"))
.andExpect(status().is5xxServerError());
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With