有一个方法public Content createChild(String path, String contentType, Map<String,Object> properties)
我想模拟。
我想以任何类型的参数调用该方法来嘲笑它,因此when()
不起作用,因为我必须告诉它,该方法应该收到什么参数。
因此,我想在任何方法上进行任何反应,而不是独立于其给定参数(使用间谍?),然后调用某种"回调"以返回一个我想从给出的真实参数中构建的 Content
对象方法。
我找不到支持此的特定API。
您可以使用Matchers
:
您可以尝试以下操作:
when(service.createChild(anyString(), anyString(), anyMap()))
.thenReturn(any(Content.class));
确保可以。我为此写了简单的单元测试
public class MockitoTest {
private SampleService sampleService;
@Before
public void setUp() throws Exception {
sampleService = Mockito.mock(SampleService.class);
}
@Test
public void mockitoTest() throws Exception {
when(sampleService.createChild(anyString(), anyString(), anyMapOf(String.class, Object.class)))
.thenAnswer(invocationOnMock -> {
//Here you can build result based on params
String pathArg = (String) invocationOnMock.getArguments()[0];
if (pathArg.equals("p1")) {
return new Content("Content for p1");
} else if (pathArg.equals("p2")) {
return new Content("Content for p2");
} else {
return invocationOnMock.callRealMethod();
}
});
Content content = sampleService.createChild("p1", "any", new HashMap<>());
assertEquals("Content for p1", content.getData());
content = sampleService.createChild("p2", "any", new HashMap<>());
assertEquals("Content for p2", content.getData());
content = sampleService.createChild("whatever", "any", new HashMap<>());
assertEquals("original", content.getData());
}
/**
* Sample service with method
*/
private static class SampleService {
public Content createChild(String path, String contentType, Map<String, Object> properties) {
return new Content("original");
}
}
/**
* Content example
*/
private static class Content {
private String data;
Content(String data) {
this.data = data;
}
String getData() {
return data;
}
}
}
您可以使用Matchers
MyClass m = mock(MyClass.class);
when(m.createChild(any(String.class), any(String.class), any(Map.class))).thenReturn(new Content());
您还应该能够以这种方式使用参数
when(m.createChild(any(String.class), any(String.class), any(Map.class))).thenAnswer(
new Answer<Content>()
{
@Override
public Content answer(final InvocationOnMock invocation) throws Throwable
{
return new Content((String) invocation.getArguments()[0],
(String) invocation.getArguments()[1],
(Map) invocation.getArguments()[2]);
}
}
}
);
您可以根据您的要求尝试使用 eq() and any()的使用:
when(service.createChild(eq("helloe/hi"), any(String.class), any(Map.class)))
.thenReturn(any(Content.class));
eq - 如果我们要为参数使用特定值,则可以使用eq()方法。
任何 - 有时我们想为给定类型的任何参数模拟行为