【发布时间】:2023-04-09 12:10:01
【问题描述】:
我正在尝试测试以下代码...
WebClient client = WebClient.create(request.getEndpointUrl());
Mono<MessageResponseItem[]> response = client.post()
.uri("...")
.bodyValue(request) // NPE happens here
.retrieve()
.bodyToMono(MessageResponseItem[].class);
我尝试进行这样的单元测试...
@PrepareForTest(WebClient.class)
@RunWith(PowerMockRunner.class)
public class MyServiceTest {
@Mock
private WebClient webClientMock;
@Mock
private WebClient.RequestHeadersSpec requestHeadersMock;
@Mock
private WebClient.RequestHeadersUriSpec requestHeadersUriMock;
@Mock
private WebClient.RequestBodyUriSpec requestBodyUriMock;
@Mock
private WebClient.ResponseSpec responseMock;
private MyService service = new MyService();
@Before
public void setup(){
PowerMockito.mockStatic(WebClient.class);
BDDMockito.given(WebClient.create(any())).willReturn(webClientMock);
}
@Test
public void HappyPath(){
MessageResponseItem item = new MessageResponseItem();
item.setRecipientId("id");
item.setResponseText("response");
MessageResponseItem[] items = {item};
MyRequest request = new MyRequest();
request.setSomething("something");
....
when(webClientMock.post()).thenReturn(requestBodyUriMock);
when(requestHeadersUriMock.uri("...")).thenReturn(requestHeadersMock);
when(requestBodyUriMock.bodyValue(any(MyRequest.class))).thenReturn(requestHeadersMock);
when(requestHeadersMock.retrieve()).thenReturn(responseMock);
when(responseMock.bodyToMono(MessageResponseItem[].class)).thenReturn(Mono.just(items));
MessageResponseItem[] result = service.callSomething(request).block();
assertThat(result.length).isEqualTo(1);
assertThat(result[0].getResponseText()).isEqualTo("response");
}
}
那么,为什么我没有 NPE 就无法通过 bodyValue 呢?我搞砸了嘲笑吗?
我试着改成...
@Mock
private WebClient.RequestHeadersUriSpec requestHeadersUriMock;
@Mock
private WebClient.RequestBodySpec requestBodyMock;
...
when(webClientMock.post()).thenReturn(requestBodyUriMock);
when(requestBodyUriMock.uri("...")).thenReturn(requestBodyMock);
when(requestBodyUriMock.bodyValue(any(MyeRequest.class))).thenReturn(requestHeadersMock);
when(requestHeadersMock.retrieve()).thenReturn(responseMock);
when(responseMock.bodyToMono(MessageResponseItem[].class)).thenReturn(Mono.just(items));
同样的问题
【问题讨论】:
-
你能发布完整的测试课程吗?
-
@AbdelghaniRoussi 有你感兴趣的部分吗?问题显然在模拟中,我只是不想弄乱这个问题。但是,如果您只是在寻找模拟定义,我可以添加这些
-
我这么说也是因为 uri 行在调试器中执行
-
你为什么要初始化
MyService,不是应该自动装配的spring bean吗? -
@AbdelghaniRoussi 感谢您的帮助,添加了整个测试。如果设置不正确,它也不会破坏服务内部。如果我使用 SpringBootTest 之类的东西,我可以将它与 Autowired 一起使用,但这不是我正在做的,因为特定原因似乎不相关。
标签: spring unit-testing mockito spring-webflux