如何模拟休息模板交换

Posted

技术标签:

【中文标题】如何模拟休息模板交换【英文标题】: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."));

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

有什么建议吗?

【问题讨论】:

这能回答你的问题吗? How do I mock a REST template exchange? 【参考方案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);
   

【讨论】:

以上是关于如何模拟休息模板交换的主要内容,如果未能解决你的问题,请参考以下文章

如何在FreeSWITCH开源软交换安装Sangoma-A400模拟卡

如何在FreeSWITCH开源软交换安装Sangoma-A400模拟卡

如何在FreeSWITCH开源软交换安装Sangoma-A400模拟卡

用于单元测试的模拟休息模板

华为三层交换机如何做RIP协议?

交换机如何配置快速生成树协议