Mockito mock objects возвращает null
Эй, я пытаюсь реализовать некоторые тесты для моего приложения jsf и для макетов, которые я использую mockito. (Я также использую spring)
@RunWith(MockitoJUnitRunner.class)
public class GeneralConfigServiceImplTest {
private GeneralConfigService generalConfigService;
@Mock
private GeneralConfigDAO generalConfigDAO;
@Mock
private GeneralConfig gen;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
generalConfigService = new GeneralConfigService();
ReflectionTestUtils.setField(generalConfigService, "generalConfigDAO", generalConfigDAO);
}
@Test
public void testAddGeneralConfigCallDAOSuccess() throws DAOException, EntityNullException, IllegalEntityArgumentException, ParseException, EntityPersistException {
gen = createGeneralConfigs("label", "value");
generalConfigService.setInstance(gen);
generalConfigService.persist();
log.info(generalConfigService.getInstance().toString());
}
}
Тест выполняется успешно, но когда я хочу получить экземпляр с помощью метода getInstance
. Все параметры, которые я установил ранее (через конструктор раньше), равны нулю.
Я новичок в издевающихся предметах, так ли это поведение нормальное, или есть ошибка в моем коде?
Ответы
Ответ 1
Это действительно зависит от реализации generalConfigService # getInstance(). Также вы можете значительно упростить свой тестовый код, если вы используете аннотацию @InjectMocks
.
При использовании MockitoJUnitRunner
вам не нужно инициализировать mocks и вводить ваши зависимости вручную:
@RunWith(MockitoJUnitRunner.class)
public class GeneralConfigServiceImplTest {
@InjectMocks
private GeneralConfigService generalConfigService;
@Mock
private GeneralConfigDAO generalConfigDAO;
@Test
public void testAddGeneralConfigCallDAOSuccess() {
// generalConfigService is already instantiated and populated with dependencies here
...
}
}
Ответ 2
Не забудьте использовать
MockitoAnnotations.initMocks(this);
Если вы являетесь объектом Mocking через аннотацию, то есть @Mock Objectname
Ответ 3
Все вызовы методов Mockito
mocks возвращают null по умолчанию. Если вы хотите, чтобы он возвращал что-то еще, вам нужно сказать это сделать с помощью инструкции when
.
Кажется, вы думаете, что следующее будет работать... вы вызываете setInstance
, а затем ожидаете, что getInstance
вернет значение, которое было передано setInstance
, так как это будет работать DAO. Если это то, что вы пытаетесь, вы не должны тестировать setInstance
, а затем вызывать getInstance
, так как getInstance
вернет все, что вы настроили mock для возврата, и не будет иметь никакого отношения к тому, что было передано setInstance
. Вместо этого используйте verify
для проверки того, что соответствующий метод DAO
был вызван методом setInstance
.
Например, если GeneralConfigService.setInstance
вызывает GeneralConfigDAO.setInstance
, тогда ваш тест должен выглядеть так:
@Test
public void testAddGeneralConfigCallDAOSuccess() throws DAOException, EntityNullException, IllegalEntityArgumentException, ParseException, EntityPersistException {
gen = createGeneralConfigs("label", "value");
generalConfigService.setInstance(gen);
generalConfigService.persist();
verify(genConfigDAO).setInstance(sameInstance(gen));
}
Кроме того, если gen
является макетом (через @Mock
), почему вы назначаете его чему-то еще через gen = createGeneralConfigs...