How can I create a unit test of this method returning void using Junit4 and Mockito?
private void fetchToken() {
try {
webClientBuilder.build().post().uri("http://localhost:8082/token")
.headers(httpHeaders -> httpHeaders.setBasicAuth("anyusername", "password")).retrieve()
.bodyToMono(Token.class).block();
} catch (Exception e) {
System.out.println("Error: " e.getMessage());
}
CodePudding user response:
A cleaner and less fragile approach is don't mock WebClient
but mock the external API using tools WireMock or MockWebServer.
I usually used MockWebServer. You may say it is an integration test but not the unit test. But it term of speed , MockWebServer is very fast just like unit test. Moreover, it allows you to use the real WebClient
instance to really exercise the full HTTP stack and you can be more confident that you are testing everything.
You can do something like :
public class SomeTest {
private MockWebServer server;
@Test
public void someTest(){
MockWebServer server = new MockWebServer();
server.start();
HttpUrl baseUrl = server.url("/token");
//stub the server to return the access token response
server.enqueue(new MockResponse().setBody("{\"access_token\":\"ABC\"}"));
//continues execute your test
....
}
}
CodePudding user response:
Using mockito like that
@Mock
private WebClient webClient;
@Mock
private WebClient.RequestBodyUriSpec uriSpec;
@Mock
private WebClient.RequestBodyUriSpec headerSpec;
@Test
void someTest(){
WebClient.RequestBodyUriSpec bodySpec = mock(WebClient.RequestBodyUriSpec.class);
WebClient.ResponseSpec response = mock(WebClient.ResponseSpec.class);
when(webClient.post()).thenReturn(uriSpec);
when(uriSpec.uri(uri)).thenReturn(headerSpec);
doReturn(bodySpec).when(headerSpec).bodyValue(body);
when(bodySpec.retrieve()).thenReturn(response);
}