繁体   English   中英

Mocking RestTemplate 交换返回 null

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM