【问题标题】:Mockito mock objects returns nullMockito 模拟对象返回 null
【发布时间】:2013-05-15 16:10:22
【问题描述】:

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

【问题讨论】:

  • 这似乎与模拟无关,因为您没有模拟有问题的对象。

标签: java testing junit mockito


【解决方案1】:

这真的取决于 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
       ...
    }
}

【讨论】:

  • 把这个留在这里:tedvinke.wordpress.com/2014/02/13/…
  • 我收到这个错误 - java.lang.AbstractMethodError: org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.isTypeMockable(Ljava/lang/Class;)Lorg/mockito/plugins/MockMaker$ TypeMockability
【解决方案2】:

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

曾经

import org.junit.jupiter.api.Test;

正确

import org.junit.Test;

【讨论】:

  • 你用的是什么版本?
  • @Andrew 4.x 我猜。目前无法访问代码。
【解决方案3】:

别忘了使用

MockitoAnnotations.initMocks(this);

如果你是通过注解模拟对象,即@Mock Objectname

【讨论】:

  • 使用 Mockito JUnit 运行器时不需要 initMocks。
  • 今天我在主类中使用模拟。对~
  • 在junit中确实不需要这个语句。但是那天,我在一个不是junit方法的main方法中运行它,你的回答有帮助。 :)
  • 酷,听起来不错:)
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    相关资源
    最近更新 更多