Mockito: как заменить метод класса, который вызывается тестируемым классом?

к сожалению, в документации Mockito отсутствует исчерпывающая информация, трудно найти правильный способ создания следующей настройки.

у меня есть класс "ResourceManager", который должен быть протестирован. Этот класс создает экземпляр другого класса "JerseyClient", который имеет метод под названием"get". Я хочу "диспетчер" не вызовите настоящий "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 вызывается, потому что он пытается сделать HTTP-запрос с реальным JerseyClient.

что такое решение и что это то, что я хочу сделать здесь? Шпионаж за реальным объектом или насмешка над объектом, когда я хочу высмеять его метод, и когда я могу заменить методы, только на насмешках или только на шпионах?

1 ответов


Я нашел ответ самостоятельно. Мне нужно добавить

@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...когда " шаблон.