如何模拟其余模板交换

时间:2019-11-12 19:22:17

标签: java rest http

我有一种使用DotNet.invokeMethodAsync('YourApp', 'YourMethodAsync') 的方法。我使用以下代码进行呼叫:

RestTemplate

final ResponseEntity<RESTResponse> responseEntity = restTemplate.exchange(uri, HttpMethod.POST, httpEntityWithHeaders, RESTResponse.class); 的类型为httpEntityWithHeads。我正在编写测试并尝试模拟RestTemplate,以便在调用HttpEntity<String>方法时将引发异常。

我正试图像这样嘲笑它:

exchange

但是运行测试时,它不会引发异常,而是继续。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

正如您所说的httpEntityWithHeads类型为HttpEntity<String>,因此必须以与HttpEntity<String>匹配的方式存根

 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."));

答案 1 :(得分:0)

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

@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);
   }