我有一个方法如下:
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。
我的代码是否正确以测试实际方法或我需要更改?我希望覆盖所有测试线。
答案 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));
}
}
可替换地:
verify
.. Mockito.any(RequestHeader.class)
中的最后一个参数。这可以替换为实际的requestHeaders
对象,但仍然有效。尝试一下。