遗憾的是,Mockito文档缺乏详尽的信息,很难找到正确的方法来创建以下设置。
我有一个叫做“ResourceManager”的类需要进行测试。这个类实例化了另一个叫做"JerseyClient"的类,它有一个名为“get”的方法。我希望"ResourceManager"不要调用真正的"JerseyClient",而是从中调用模拟对象(或存根?)(在Mockito上下文中,mocking和stubbing或mocks和spies之间的区别对我来说已经不太清楚了)。
我的尝试是@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请求。
解决方案是什么?我想在这里做什么?是在监视真实对象还是模拟对象,在我想要模拟其方法的对象上,什么时候可以替换方法,只能在模拟或间谍上吗?