我尝试为我的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。
我是模拟对象的新手,所以这种行为是正常的,还是我的代码中有错误?
答案 0 :(得分:16)
这实际上取决于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
...
}
}
答案 1 :(得分:8)
别忘了使用
MockitoAnnotations.initMocks(this);
如果您通过注释即@Mock Objectname
答案 2 :(得分:3)
默认情况下,对Mockito
模拟的所有方法调用都返回null。如果您希望它返回其他内容,您需要通过when
语句告诉它。
您似乎认为以下内容有效...您调用setInstance
然后期望getInstance
返回传递给setInstance
的值,因为这是DAO会起作用。如果这是您正在尝试的内容,则不应通过调用setInstance
来测试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...
将其分配给其他内容
答案 3 :(得分:0)
我的问题是Test
注释的导入不正确:
是
import org.junit.jupiter.api.Test;
正确
import org.junit.Test;