[英]Mocking RestTemplate exchange returns null
我在这里查看了多个帖子 - 例如一个并尝试了多种变体,但在 mocking 之后似乎仍然无法获得非空值
RestTemplate#exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables)
。
我没有通过任何uriVariables
。
这是我的简化源代码:
Request request = new Request();
request.setDataId(1);
String query = "query ($ request:Request!)\n" +
"{\n" +
" fetchData(request:$request)\n" +
" {\n" +
" planId\n" +
" }\n" +
" }\n";
RequestBody requestBody = new RequestBody(query,Collections.singletonMap("request",
request));
HttpEntity<RequestBody> request = new HttpEntity<>(requestBody, createHttpHeaders());
return restTemplate.exchange("http://localhost:8080/gql", HttpMethod.POST, request,
JsonNode.class);
private HttpHeaders createHttpHeaders()
{
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
return headers;
}
RequestBody
class (使用lombok
):
@Getter
@AllArgsConstructor
public class RequestBody implements Serializable {
private static final long serialVersionUID = -203524485553511477L;
private String query;
private Map<String,Object> variables;
}
以及对应的测试代码:
@Mock
private RestTemplate restTemplate;
@Mock
private ObjectMapper objectMapper;
@InjectMocks
private FetchDataService fetchDataService;
@Test
public void testFetchData() {
String json = new String(Files.readAllBytes(Paths.get("src/test/resources/Data.json")));
ObjectMapper testMapper = new ObjectMapper();
JsonNode expectedResponse = testMapper.readTree(json);
when(restTemplate.exchange(anyString(), any(HttpMethod.class), any(HttpEntity.class),
any(Class.class)))
.thenReturn(new ResponseEntity<>(expectedResponse, HttpStatus.OK));
ResponseEntity<JsonNode> response = fetchDataService.getData();
}
expectedResponse
是上面的JsonNode
实例。 问题是response
总是返回null
主体。
如果我使用它,我可以验证呼叫是否发生 -
Mockito.verify(restTemplate)
.exchange(anyString(), any(HttpMethod.class), any(HttpEntity.class), any(Class.class));
如果这很重要,我正在使用 junit 5、spring 启动 2.6.7、jdk 11。
正如作者@linuxNoob 在我们在评论中的讨论中所证实的那样,问题在于expectedResponse
没有正确的JsonNode
值。 原因是ObjectMapper
实例在没有任何配置的情况下被模拟以从其方法返回某些内容。 因此,任何调用都会返回默认的null
值,即testMapper.readTree(json)
返回null
最终成为ResponseEntity.body
通过expectedResponse
的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.