Подтвердить что ты не робот

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. Все параметры, которые я установил ранее (через конструктор раньше), равны нулю. Я новичок в издевающихся предметах, так ли это поведение нормальное, или есть ошибка в моем коде?

4b9b3361

Ответ 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...