[英]Mockito mock objects returns 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。 我是模拟对象的新手,所以这种行为正常吗,还是我的代码有错误?
这真的取决于 GeneralConfigService#getInstance() 实现。 如果您使用@InjectMocks
注释,您也可以大大简化您的测试代码。
使用MockitoJUnitRunner
您不需要手动初始化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
...
}
}
不要忘记使用
MockitoAnnotations.initMocks(this);
如果你通过注解@Mock Objectname
对象,即@Mock Objectname
我的问题是Test
注释的导入不正确:
曾是
import org.junit.jupiter.api.Test;
正确的
import org.junit.Test;
默认情况下,对Mockito
所有方法调用都返回 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
),为什么要通过gen = createGeneralConfigs...
将它分配给其他东西gen = createGeneralConfigs...
该线程是一个旧线程,但我遇到了与 junit5 (v5.8.2) 和 mockito (mockito-core:jar:4.5.1) 相同的问题,这里的答案都没有帮助我。 经过 1.5 小时的搜索,我找到了这篇文章:
https://mincong.io/2020/04/19/mockito-junit5/
这对我有帮助,我使用了第一个解决方案,所以我添加了
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>2.28.2</version>
<scope>test</scope>
</dependency>
作为新的依赖项,我用以下注释注释了我的 class (并且我删除了@RunWith(MockitoJUnitRunner.class)注释):
@ExtendWith(MockitoExtension.class)
请在文章中找到解释。 我希望这对其他人也有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.