我正在使用 RestTemplate postForEntity
方法将正文发布到端点。我需要帮助使用 Mockito 为我的代码编写测试用例。返回类型为 void,但如果需要测试,可以将其更改为 Types
或 code
。我引用了许多其他文档,但它们非常通用,我尝试使用它们,但大多数对我不起作用,因为请求和返回类型不同。 。任何建议表示赞赏。谢谢您
这是我的 Java 类
public void postJson(Set<Type> Types){
try {
String oneString = String.join(",", Types);
Map<String, String> requestBody = new HashMap<>();
requestBody.put("type", oneString);
JSONObject jsonObject = new JSONObject(requestBody);
HttpEntity<String> request = new HttpEntity<String>(jsonObject.toString(), null);
ResponseEntity result = restTemplate.exchange(url, HttpMethod.POST,
new HttpEntity<>(request, getHttpHeaders()), String.class);
}
}
}
最佳答案
您正在测试 MyClass 类内部的逻辑,因此您不应该模拟它。 RestTemplate
是 MyClass 内部的依赖项,因此这正是您需要模拟的内容。一般来说,它在您的测试中应该如下所示:
这只是一个简单的例子。一个好的做法是检查传递给模拟的参数是否等于预期的参数。一种方法是将 Mockito.eq()
替换为真实的预期数据。另一种是单独验证,如下所示:
public ResponseEntity<String> postJson(Set<Type> Types){
try {
String oneString = String.join(",", Types);
Map<String, String> requestBody = new HashMap<>();
requestBody.put("type", oneString);
JSONObject jsonObject = new JSONObject(requestBody);
HttpEntity<String> request = new HttpEntity<String>(jsonObject.toString(), null);
ResponseEntity result = restTemplate.exchange(url, HttpMethod.POST,
new HttpEntity<>(request, getHttpHeaders()), String.class);
}
}
return Types;
您可以按如下方式为上述方法编写测试
@Mock
RestTemplate restTemplate;
private Poster poster;
HttpEntity<String> request = new HttpEntity<>(jsonObject.toString(), getHttpHeaders());
ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.POST, request, String.class);
Mockito.verify(restTemplate, Mockito.times(1)).exchange(
Mockito.eq(uri),
Mockito.eq(HttpMethod.POST),
Mockito.eq(request),
Mockito.eq(String.class));
Assert.assertEquals(result, poster.postJson(mockData));
HttpHeaders getHttpHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.add(// whatever you need to add);
return headers;
}
关于java - Mockito 单元测试 RestTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59780621/