Mockito:如何替换被测试类调用的类的方法?
不幸的是,Mockito文档缺乏详尽的信息,很难找到如何创建以下设置的正确方法。
我有一个类“ResourceManager”,应该进行测试。该类实例化另一个类“JerseyClient”,该类具有一个名为“get”的方法。我希望“ResourceManager”不要从中调用真正的“JerseyClient”,而是从中调用一个模拟(或存根?)(我已经不清楚在Mockito上下文中模拟和存根或模拟和间谍之间的区别是什么)。
我的尝试是@Mock(或@Spy?JerseyClient,或至少一种方法:
@RunWith(MockitoJUnitRunner.class)
public class ResourceManagerTest
{
@Mock
private JerseyClient jerseyClient;
@Test
public void testResultHandling() throws JsonGenerationException, JsonMappingException, IOException, ResourceException
{
TestEntity testEntity = new TestEntity();
ResourceManager resourceManager = new ResourceManager();
testEntity.setGet(true);
testEntity.setTestAttribute("1stTest");
when(jerseyClient.get(anyString())).thenReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}");
// doReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}").when(jerseyClient).get(anyString());
TestEntity result = (TestEntity)resourceManager.execute(testEntity, TestEntity.class);
assertThat(result, is(notNullValue()));
assertThat(result.getMessage(), is("success"));
assertThat(result.getTestAttribute(), is("2ndTest"));
}
}
如您所见,我试图模拟 jerseyClient.get() 方法以返回预定义的 JSON 字符串:
when(jerseyClient.get(anyString())).thenReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}");
或
doReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}").when(jerseyClient).get(anyString());
但它们都不起作用。这意味着调用真正的 JerseyClient.get 方法,因为它尝试使用真正的 JerseyClient 发出 HTTP 请求。
解决方案是什么,这是我想在这里做的是什么?它是监视真实对象还是模拟对象,而我想模拟它的方法,以及我什么时候可以替换方法,仅在模拟上还是仅在间谍上?