2017-02-04 31 views
1

我有下面的方法:得到錯誤 - InvalidUseOfMatchersException中的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); 
    } 

我的Mockito方法如下

@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.

是否我的代碼是正確的測試實際的方法或我需要改變?我想覆蓋所有線路的測試。

+0

'requestHeaders'對於'when'調用無效。所以,做一些例外消息給你的建議。 – Tom

+0

我在下面嘗試doNothing()。when(abc).getAbcExample(Mockito.any(Double.class),Mockito.any(Double.class),Mockito.any(Integer.class),Mockito.eq(「」) Mockito.any(RequestHeader.class));但得到MockitoException並且只有void方法使用doNothing – Karthick

回答

1

我並根據您的代碼,這裏有一些見解一些測試..

1)你並不需要使用doReturn()()的時候..語法。在你的情況下, when()。thenReturn()很好(雖然你仍然可以堅持到另一個版本,直到你)。它

2)不知道你是怎麼實例化對象'abc' ..但它必須是一個@Mock@Spy,否則你無法使用時,()。thenReturn()功能。

3)在當()..你正在使用的任何()與真正的對象(r​​equstHeaders對象)組合沒有匹配:

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對象,並仍然可以工作。

試一試。