如何模拟休息模板交换
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<String>
。我正在编写一个测试并尝试模拟 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】:正如你所说的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."));
【讨论】:
【参考方案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模拟卡