如何创建这个私有方法的单元测试,使用Junit4和Mockito返回void?
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());
}
发布于 2022-10-10 08:04:39
像这样使用莫基托
@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);
}
发布于 2022-10-10 07:58:15
一个更干净和不那么脆弱的方法是不要模仿WebClient
,而是使用工具WireMock或MockWebServer来模拟外部API。
我通常使用MockWebServer。您可以说这是一个集成测试,而不是单元测试。但它的速度术语,MockWebServer非常快,就像单元测试。此外,它允许您使用真正的WebClient
实例来真正执行完整的HTTP堆栈,并且您可以更加确信您正在测试所有内容。
你可以这样做:
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
....
}
}
https://stackoverflow.com/questions/74010147
复制相似问题