13

不幸的是,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 请求。

解决方案是什么,我想在这里做什么?它是在监视一个真实的对象还是在模拟一个我想模拟它的方法的对象,我什么时候可以替换方法,只在模拟上还是只在间谍上?

4

1 回答 1

12

我自己找到了答案。我需要添加

@InjectMocks
private ResourceManager resourceManager;

然后我需要用这个实例运行测试:

@RunWith(MockitoJUnitRunner.class)
public class ResourceManagerTest
{
    @Mock
    private JerseyClient jerseyClient;

    @InjectMocks
    private ResourceManager resourceManager;

    @Test
    public void testResultHandling() throws JsonGenerationException, JsonMappingException, IOException, ResourceException
    {
        TestEntity testEntity = new TestEntity();

        testEntity.setGet(true);
        testEntity.setTestAttribute("1stTest");

        when(jerseyClient.get(anyString())).thenReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}");   

        TestEntity result = (TestEntity)resourceManager.execute(testEntity, TestEntity.class);

        assertThat(result, is(notNullValue()));
        assertThat(result.getMessage(), is("success"));
        assertThat(result.getTestAttribute(), is("2ndTest"));
    }
}

而且我还可以使用“doReturn...when”模式。

于 2013-06-08T16:10:34.687 回答