31

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

4

4 回答 4

23

它实际上取决于 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
       ...
    }
}
于 2013-05-15T16:36:31.450 回答
14

我的问题是注释的错误导入Test

曾是

import org.junit.jupiter.api.Test;

正确的

import org.junit.Test;

于 2019-11-05T15:32:56.563 回答
13

不要忘记使用

MockitoAnnotations.initMocks(this);

如果您通过注释模拟对象,即@Mock Objectname

于 2015-10-21T10:57:04.993 回答
7

默认情况下,对 mock 的所有方法调用都Mockito返回 null。如果您希望它返回其他内容,则需要通过when声明告诉它这样做。

您似乎认为以下将起作用......您调用setInstance然后期望getInstance返回传递给的值,setInstance因为这就是 DAO 的工作方式。如果这是您正在尝试的,则不应setInstance通过 then 调用进行测试,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...

于 2013-05-15T18:45:57.477 回答