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