有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Mockito mock对象返回null

我尝试为我的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) 个答案

  1. # 1 楼答案

    别忘了使用

    MockitoAnnotations.initMocks(this);
    

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

  2. # 2 楼答案

    这实际上取决于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
           ...
        }
    }
    
  3. # 3 楼答案

    我这里的问题是Test站的导入不正确:

    import org.junit.jupiter.api.Test;

    正确的

    import org.junit.Test;

  4. # 4 楼答案

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

    你似乎认为以下方法会奏效。。。调用setInstance,然后期望getInstance返回传递给setInstance的值,因为DAO就是这样工作的。如果这是您正在尝试的,那么您不应该通过调用getInstance来测试setInstance,因为getInstance将返回您配置的模拟返回的内容,并且与传递给setInstance的内容没有关系。相反,使用verify验证是否从setInstance方法调用了DAO的适当方法

    例如,如果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(通过@Mock),为什么要通过gen = createGeneralConfigs...将它分配给其他对象