2. 返回void的测试覆盖
【要测试的方法】:
@Component
public class UserDao{
@Autowired
private UserMapper userMapper
@Autowired
private SystemErrorRecoder systemErrorRecoder
public void putUser(UserDTO userDto){
try{
userMapper.putUser(userDto);
}catch(DataAccessException e){
systemErrorRecoder.addMsgError(e.getMessage());
}
}
}
【测试方法】:
@RunWith(PowerMockRunner.class) // 必要,确保使用PowerMock框架引擎执行单元测试
@PowerMockIgnore("javax.management.*")//解决报错previously initiated loading for different type with name "javax/managemen
public class UserDaoTest[
private UserDao userDao;
private UserMapper userMappers;
private SystemErrorRecoder systemErrorRecoder;
@Before//在@Test代码执行前执行,用于初始化
public void setUp(){
userDao = new UserDao();
userMappers = PowerMockito.mock(UserMapper.class);//mock获得UserMapper类的代理对象
systemErrorRecoder = PowerMockito.mock(SystemErrorRecoder.class);
Whitebox.setInternalState(userDao,"userMapper",userMappers);//为本类的userDao对象的私有属性userMapper赋值userMappers
Whitebox.setInternalState(userDao,"systemErrorRecoder",systemErrorRecoder);
}
@Test
public void testPutUser(){
UserDTO user = new UserDTO();
PowerMockito.doNothing().when(userMappers).putUser(Mockito.any(UserDTO.class)); //主要代码
userDao.putUser(user);
Mockito.verify(userMappers).putUser(Mockito.any(UserDTO.class));
//a.对异常打桩
DataAccessException exception = PowerMockito.mock(DataAccessException.class);
//b.模拟try内的方法,doThrow异常
PowerMockito.doThrow(exception).when(userMappers).putUser(Mockito.any(UserDTO.class));
//c.模拟catch内的方法(如果catch内不涉及别的方法,可以省略)
PowerMockito.doNothing().when(systemErrorRecoder).addMsgError(Mockito.anyString())
//d.verify验证
userDao.putUser(user);
Mockito.verify(systemErrorRecoder).addMsgError(Mockito.anyString());
【要点】:(主要思想可参考:PowerMockito主要思想以及常规异常覆盖)
返回void的方法,可通过doNothing来进行打桩测试,没有返回值,就没法断言验证,那怎么知道执行正确与否?
在不触发异常的情况下,userDao.putUser(user);执行完,意味着userMappers.putUser执行完
所以,通过Mockito.verify来验证userMappers.putUser是否被执行过;
被执行了,就能说明userDao.putUser(user);执行正确
所以,要知道真实方法执行完后,执行到了哪来,尽量的与代理方法相关联来验证,实在没有那就不验证了。