Mockito 模拟 WebClient Json 响应

Mockito mock WebClient Json response

我想在 Spring 中模拟 WebClient。

public Test getTest(String lanId) {

    return webClient.get()
            .uri("url")
            .retrieve()
            .bodyToMono(Test.class)
            .block();
}

测试方法:

@Mock ????
WebClient webClient;

@InjectMocks
TranslateDao translateDao;

@Test
void getUserId() {
    webClient = WebClient.builder().build();

    var ww = translateDao.getTest("qw");
    System.out.println("");
}

当我尝试在 webClient 上不使用 @Mock 时,我得到了空指针。 我想这样做:

when(WebClient.sth).thenReturn("{JSON!!}")
var result = translateDao.getTest("test")
assert....

有什么想法吗?

这个问题有点令人困惑,因为:

  1. 你在嘲笑 Webclient
  2. 在您的测试中,您将实际值分配给模拟值(这似乎不正确)
  3. 在你的最后一个例子中,你试图模拟 WebClient 上的静态调用(mockito 不支持开箱即用)

WebClient 是否通过依赖注入或其他方式提供给您的class?

编辑:似乎当您想模拟 WebClient 时,您将面临大量的模拟...

参考:https://www.baeldung.com/spring-mocking-webclient

我的建议是不要模拟 WebClient,而是使用 MockWebServer。

如果您坚持模拟 WebClient,则需要模拟它的每个部分:

@Mock
private WebClient.RequestBodyUriSpec requestBodyUriMock;
@Mock
private WebClient.RequestHeadersSpec requestHeadersMock;
@Mock
private WebClient.RequestBodySpec requestBodyMock;
@Mock
private WebClient.ResponseSpec responseMock;
@Mock
private WebClient webClient;

@InjectMocks
YourService serviceUsingWebClient;

@Test
void makeAPostRequest() {

    when(requestBodyUriMock.uri(eq("uri"))).thenReturn(requestBodyMock);
    when(requestBodyMock.bodyValue(eq(yourPojoRequestHere))).thenReturn(requestHeadersMock);
    when(webClient.post()).thenReturn(requestBodyUriMock);
    when(requestHeadersMock.retrieve()).thenReturn(responseMock);
    when(responseMock.bodyToMono(YourPojoClass.class)).thenReturn(Mono.just(yourPojoResponse));
}