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....
有什么想法吗?
这个问题有点令人困惑,因为:
- 你在嘲笑 Webclient
- 在您的测试中,您将实际值分配给模拟值(这似乎不正确)
- 在你的最后一个例子中,你试图模拟 WebClient 上的静态调用(mockito 不支持开箱即用)
WebClient 是否通过依赖注入或其他方式提供给您的class?
编辑:似乎当您想模拟 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));
}
我想在 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....
有什么想法吗?
这个问题有点令人困惑,因为:
- 你在嘲笑 Webclient
- 在您的测试中,您将实际值分配给模拟值(这似乎不正确)
- 在你的最后一个例子中,你试图模拟 WebClient 上的静态调用(mockito 不支持开箱即用)
WebClient 是否通过依赖注入或其他方式提供给您的class?
编辑:似乎当您想模拟 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));
}