Mock RestClient.RequestBodyUriSpec body返回null问题及any()失效疑问
问题:Mock RestClient.RequestBodyUriSpec的body方法时返回null
问题描述
Mock RestClient.RequestBodyUriSpec的body方法时,RestClient调用链中该方法返回null。
测试用例
package org.mytest.tests; import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestClient; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; class RestClientTest { @Test void mockRestClientTest() { // 创建RestClient及其组件的Mock对象 RestClient restClient = mock(RestClient.class); RestClient.RequestBodyUriSpec requestBodyUriSpecMock = mock(RestClient.RequestBodyUriSpec.class); when(restClient.method(any())).thenReturn(requestBodyUriSpecMock); RestClient.RequestBodySpec requestBodySpecMock = mock(RestClient.RequestBodySpec.class); RestClient.ResponseSpec responseSpecMock = mock(RestClient.ResponseSpec.class); // 定义链式调用的行为 when(restClient.method(any())).thenReturn(requestBodyUriSpecMock); when(requestBodyUriSpecMock.uri(anyString())).thenReturn(requestBodySpecMock); when(requestBodySpecMock.headers(any())).thenReturn(requestBodySpecMock); when(requestBodySpecMock.headers(any()).body(any())).thenReturn(requestBodySpecMock); when(requestBodySpecMock.body(any())).thenReturn(requestBodySpecMock); when(requestBodySpecMock.body(any(), any())).thenReturn(requestBodySpecMock); when(requestBodyUriSpecMock.body(any(Object.class))).thenReturn(requestBodySpecMock); when(requestBodySpecMock.retrieve()).thenReturn(responseSpecMock); when(responseSpecMock.toEntity(String.class)).thenReturn(new ResponseEntity<>("responseBody", HttpStatus.OK)); // 测试Mock结果 RestClient.RequestBodySpec result = requestBodySpecMock.headers(any()); System.out.println("Mock requestBodySpecMock.headers -> " + result); result = requestBodySpecMock.body(any()); System.out.println("Mock requestBodySpecMock.body -> " + result); RestClient.ResponseSpec responseResult = requestBodySpecMock.retrieve(); System.out.println("Mock requestHeadersSpecMock.retrieve -> " + responseResult); result = requestBodySpecMock.headers(any()).body(any()); System.out.println("Mock requestBodySpecMock.headers.body -> " + result); RestClient.RequestBodySpec requestBodySpec = restClient.method(HttpMethod.POST) .uri("https://localhost/my-server/") .headers( HttpHeaders::clear) .body("SomeBody"); System.out.println("RequestBodySpec -> " + requestBodySpec); ResponseEntity<String> resultStr = restClient.method(HttpMethod.POST) .uri("https://localhost/my-server/") .headers( HttpHeaders::clear) .body("Some Body") .retrieve() .toEntity(String.class); System.out.println(resultStr); } }
打印输出结果
Mock requestBodySpecMock.headers -> Mock for RequestBodySpec, hashCode: 836972194 Mock requestBodySpecMock.body -> Mock for RequestBodySpec, hashCode: 836972194 Mock requestHeadersSpecMock.retrieve -> Mock for ResponseSpec, hashCode: 556945462 Mock requestBodySpecMock.headers.body -> Mock for RequestBodySpec, hashCode: 836972194 RequestBodySpec -> null
问题点
以下调用链中,body("SomeBody")本应返回Mock的requestBodySpecMock对象,但实际返回null:
RestClient.RequestBodySpec requestBodySpec = restClient.method(HttpMethod.POST) .uri("https://localhost/my-server/") .headers( HttpHeaders::clear) .body("SomeBody");
解决方法与疑问
通过使用when(requestBodySpecMock.body(anyString())).thenReturn(requestBodySpecMock)来Mock body方法后,问题解决,调用链正常返回Mock对象。但疑问在于:为什么使用any()匹配器时无法生效?
内容的提问来源于stack exchange,提问作者Rupesh
相关产品推荐
相关产品推荐

