我正面临这个小问题。我有这样的服务
public class Myservice {
MyRestService myRestService;
public List<String> getNames() throws RestClientException {
return myRestService.getNames();
}
....
和一个像这样的控制器:
@RequestMapping(value = URL, method = GET)
public ModelAndView display(final ModelMap model) {
....
try{
List<String> listOfNames = myService.getNames();
}catch(RestClientException e){
LOG.error("Error when invoking Names service", e);
}
model.addAttribute("names", listOfNames);
return new ModelAndView(VIEW, model);
}....
到目前为止工作得很好,单元测试服务的实际情况 返回一个字符串列表工作正常。
但是由于该服务调用另一个基本上是可以抛出异常的rest客户端,我想模仿那个案例。
如果我有myService调用myRestClientService
,其中myRestClientService
抛出异常,我应该使用方法签名&#34;抛出异常&#34; ?
final RestClientException myException = mockery.mock(RestClientException.class);
mockery.checking(new Expectations() {
{
oneOf(myService).getNames();
will(returnValue(myException));
...
但是我收到一个错误,我不能从只返回List的方法中抛出异常来解决这个问题?我怎么测试呢?
答案 0 :(得分:3)
根据文档Throwing Exceptions from Mocked Methods,您应该使用throwException
而不是returnValue
。这意味着代码应该像
will(throwException(myException));
答案 1 :(得分:1)
可能没有必要模拟 RestClientException 。该行可能抛出IllegalArgumentException并停在那里。 E.g。
java.lang.IllegalArgumentException: org.springframework.web.client.RestClientException is not an interface
正在运行的示例可能如下所示:
@Test(expected = RestClientException.class)
public void testDisplayThrowException() throws Exception {
MyService myService = mockery.mock(MyService.class);
mockery.checking(new Expectations() {
{
allowing(myService).getNames();
will(throwException(new RestClientException("Rest client is not working")));
}
});
myService.getNames();
}