Mockito模拟对象返回null

时间:2013-05-15 16:10:23

标签: java testing junit mockito

我尝试为我的JSF应用程序和我使用mockito的模拟实现一些测试。 (我也用春天)

@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方法检索实例时。我之前设置的所有参数(通过之前的构造函数)都为null。 我是模拟对象的新手,所以这种行为是正常的,还是我的代码中有错误?

4 个答案:

答案 0 :(得分:16)

这实际上取决于GeneralConfigService#getInstance()实现。如果使用@InjectMocks注释,也可以大量简化测试代码。

使用MockitoJUnitRunner时,您不需要初始化模拟并手动注入依赖项:

@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
       ...
    }
}

答案 1 :(得分:8)

别忘了使用

MockitoAnnotations.initMocks(this);

如果您通过注释即@Mock Objectname

模拟对象

答案 2 :(得分:3)

默认情况下,对Mockito模拟的所有方法调用都返回null。如果您希望它返回其他内容,您需要通过when语句告诉它。

您似乎认为以下内容有效...您调用setInstance然后期望getInstance返回传递给setInstance的值,因为这是DAO会起作用。如果这是您正在尝试的内容,则不应通过调用setInstance来测试getInstance,因为getInstance将返回您已配置模拟返回的任何内容,并且与之无关传递给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...将其分配给其他内容

答案 3 :(得分:0)

我的问题是Test注释的导入不正确:

import org.junit.jupiter.api.Test;

正确

import org.junit.Test;