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。
我不熟悉模拟对象,所以这种行为是正常的,还是我的代码中有错误
# 1 楼答案
别忘了使用
如果您是通过注释模拟对象,即
@Mock Objectname
# 2 楼答案
这实际上取决于GeneralConfigService#getInstance()实现。如果使用
@InjectMocks
注释,您还可以大大简化测试代码使用
MockitoJUnitRunner
时,不需要初始化模拟并手动注入依赖项:# 3 楼答案
我这里的问题是
Test
站的导入不正确:是
import org.junit.jupiter.api.Test;
正确的
import org.junit.Test;
# 4 楼答案
默认情况下,对
Mockito
mock的所有方法调用都返回null。如果希望它返回其他内容,则需要通过when
语句告诉它这样做你似乎认为以下方法会奏效。。。调用
setInstance
,然后期望getInstance
返回传递给setInstance
的值,因为DAO就是这样工作的。如果这是您正在尝试的,那么您不应该通过调用getInstance
来测试setInstance
,因为getInstance
将返回您配置的模拟返回的内容,并且与传递给setInstance
的内容没有关系。相反,使用verify
验证是否从setInstance
方法调用了DAO
的适当方法例如,如果
GeneralConfigService.setInstance
调用GeneralConfigDAO.setInstance
,那么您的测试应该如下所示另外,如果
gen
是一个mock(通过@Mock
),为什么要通过gen = createGeneralConfigs...
将它分配给其他对象