java - Mockito 单元测试 RestTemplate

标签 java unit-testing post junit resttemplate

我正在使用 RestTemplate postForEntity 方法将正文发布到端点。我需要帮助使用 Mockito 为我的代码编写测试用例。返回类型为 void,但如果需要测试,可以将其更改为 Typescode。我引用了许多其他文档,但它们非常通用,我尝试使用它们,但大多数对我不起作用,因为请求和返回类型不同。 。任何建议表示赞赏。谢谢您

这是我的 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/

相关文章:

java - 与 JPA 的数据库独立字符串比较

Django - 测试不同的视觉 block

php - PHP脚本打印不执行

javascript - 使用 jQuery 从 Ajax 响应构建表行(不使用静态 json 数据)

Java : issue with actionlistener and retrieving textbox input

java - 如何在不使用HTML anchor (一)标签的情况下实现 "Open Link in new Tab"

java - 带有基于内容的过滤器的 JMS

java - 让测试通过一组 JMock 的模拟方法调用

c# - 类中接口(interface)之外的公共(public)方法

java - 在Java中发布XML并获取响应代码