【问题标题】:How to mock rest template exchange如何模拟休息模板交换
【发布时间】:2020-03-08 13:21:18
【问题描述】:

我有一个使用RestTemplate 的方法。我使用以下代码拨打电话:

         final ResponseEntity<RESTResponse> responseEntity = restTemplate.exchange(uri,
                                                                               HttpMethod.POST,
                                                                               httpEntityWithHeaders,
                                                                               RESTResponse.class);

httpEntityWithHeads 的类型为 HttpEntity&lt;String&gt;。我正在编写一个测试并尝试模拟 RestTemplate 以便当它调用 exchange 方法时,它会抛出异常。

我试图像这样模拟它:

      when(restTemplate.exchange(
     ArgumentMatchers.contains(randomHost),
     ArgumentMatchers.eq(HttpMethod.POST),
     ArgumentMatchers.<HttpEntity<List<String>>>any(),
     ArgumentMatchers.<ParameterizedTypeReference<List<RESTResponse>>>any())

  ).thenThrow(new ResourceAccessException("Random exception message."));

但是在运行测试时,它不会抛出异常,它只是继续。

有什么建议吗?

【问题讨论】:

标签: java rest http


【解决方案1】:

正如你所说的httpEntityWithHeadsHttpEntity&lt;String&gt; 类型,所以你必须以匹配HttpEntity&lt;String&gt; 的方式存根

 when(restTemplate.exchange(
 ArgumentMatchers.contains(randomHost),
 ArgumentMatchers.eq(HttpMethod.POST),
 ArgumentMatchers.<HttpEntity<String>>any(),
 ArgumentMatchers.<ParameterizedTypeReference<List<RESTResponse>>>any())

).thenThrow(new ResourceAccessException("Random exception message."));

【讨论】:

    【解决方案2】:

    在我看来,您的最后一个参数不是一个列表而是一个类,这就是存根失败的原因,我尝试了以下方法并且它正在工作。

    @Test(expected = IllegalArgumentException.class)
    public void test() {
        RestTemplate restTemplate = mock(RestTemplate.class);
    
        when(restTemplate.exchange(anyString(), ArgumentMatchers.eq(HttpMethod.POST),
            any(HttpEntity.class), 
            any(Class.class))).thenThrow(new IllegalArgumentException("a"));
    
        Rest rest = new Rest(restTemplate);
        rest.call();
    }
    
    
        public void call(){
    
           HttpEntity<Object> httpEntityWithHeaders= new HttpEntity<>(null);
           final ResponseEntity<Object> responseEntity = restTemplate.exchange("a",
            HttpMethod.POST,
            httpEntityWithHeaders,
            Object.class);
       }
    

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 2018-09-01
      • 2017-01-22
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 2018-12-20
      相关资源
      最近更新 更多