获取错误 - Mockito中的InvalidUseOfMatchersException

时间:2017-02-04 13:13:16

标签: java junit mockito

我有一个方法如下:

public Response getAbcExample(Double a, Double b, Integer c, String d, RequestHeader requestHeader)
            throws Exception  {
        Map<String, String> logMap = new HashMap<>();
        Response response = new Response();
        String jsonString = _getAB_Exampe(a, b, c, requestHeader);
    }

我的模拟方法在

之下
@Test
public void getabc_Example_Success() throws IOException{
    Response response=new Response();
    RequestHeader requestHeaders=new RequestHeader();
    response.setMessage("Success");
    response.setStatusCode("200");          
when(abc.getabc_Example_Success(anyDouble(),anyDouble(),anyInt(),anyString(),requestHeaders)).thenReturn(response);
        Mockito.verify(abc,Mockito.times(1)).getabcExable(Mockito.any(Double.class),Mockito.any(Double.class),Mockito.any(Integer.class),Mockito.eq(""),Mockito.any(RequestHeader.class));      
  }

但我得到了:

  

org.mockito.exceptions.misusing.InvalidUseOfMatchersException。

我的代码是否正确以测试实际方法或我需要更改?我希望覆盖所有测试线。

1 个答案:

答案 0 :(得分:2)

我根据您的代码进行了一些测试,这里有一些见解..

1)你不需要使用doReturn()。when().. syntax ..在你的情况下,when()。thenReturn()很好(虽然你仍然可以坚持到另一个版本,由你决定。)

2)不确定如何实例化'abc'对象..但必须是@Mock@Spy,否则您无法使用它上面的when()。thenReturn()功能。

3)在when()中你将any()与没有匹配器的真实对象结合使用(requstHeaders对象):

when(abc.getabc_Example_Success(anyDouble(),anyDouble()
            ,anyInt(),anyString(),requestHeaders));

你不能这样做,Mockito会抛出错误:

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

您已将其设为Mockito.any(RequestHeaders.class)Mockito.eq(requestHeaders)

工作解决方案

因此,基于上述情况,您的测试类应该看起来或多或少如下:

@Spy
private Abc abc;

    @Before
    public void init(){
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void tst() throws Exception{
        Response response= mock(Response.class);
        RequestHeader requestHeaders=mock(RequestHeader.class);
        when(a.getAbcExample(anyDouble(),anyDouble(),anyInt()
        ,anyString(),Mockito.eq(requestHeaders))).thenReturn(response);

        abc.getAbcExample(1.0, 1.0, 1, "", requestHeaders); // invoke the mocked method

        verify(a, times(1)).getAbcExample(Mockito.any(Double.class)
                 ,Mockito.any(Double.class),Mockito.any(Integer.class)
                 ,Mockito.eq(""),Mockito.any(RequestHeader.class));


    }
}

可替换地:

  • 您可以使用@Mock代替@Spy
  • verify .. Mockito.any(RequestHeader.class)中的最后一个参数。这可以替换为实际的requestHeaders对象,但仍然有效。

尝试一下。