如何模拟服务以抛出异常返回List的方法?

时间:2017-03-29 05:49:10

标签: java unit-testing junit jmock

我正面临这个小问题。我有这样的服务

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的方法中抛出异常来解决这个问题?我怎么测试呢?

2 个答案:

答案 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();
}