1. 测试主要操作步骤:
【要测试的方法】:
@Component
public class UserDao{
@Autowired
private UserMapper userMapper
@Autowired
private SystemErrorRecoder systemErrorRecoder
public List<UserDTO> getUsers(String userName){
List<UserDTO> userDtos = null;
try{
userDtos = userMapper.getUsers(userName);
}catch(DataAccessException e){
systemErrorRecoder.addMsgError(e.getMessage());
}
if(CollectionUtils.isEmpty(userDtos)){
return new ArrayList();
}
return userDtos;
}
}
【测试方法】:
@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 testGetUsers(){
List<UserDTO> userDtos = new ArrayList<>();
userDtos.add(new UserDTO);
userDtos.add(new UserDTO);
PowerMockito.when(userMappers.getUsers("test").thenReturn(userDtos);
Assert.assertEuqals(userDtos,userDao.getUsers("test"))
//以上覆盖除了Catch内的代码(先测试覆盖没有异常的代码)
//a.对异常打桩
DataAccessException exception = PowerMockito.mock(DataAccessException.class);
//b.模拟try内的方法,doThrow异常
PowerMockito.doThrow(exception).when(userMappers).getUsers("test")
//c.模拟catch内的方法(如果catch内不涉及别的方法,可以省略)
PowerMockito.doNothing().when(systemErrorRecoder).addMsgError(Mockito.anyString())
//d.验证异常后返回的结果
Assert.assertTure(CollectionUtils.isEmpty(userDao.getUsers("test")))
【异常覆盖】:
如上通过doThrow来覆盖,先测试catch外的,再测试异常的代码,否则可能会报test should never throw an exception to this level
【主要思想】:
①. new出来的测试方法类对象是真实对象,即userDao为真实对象,那么其属性userMapper也是真实属性
②. 通过mock出来的对象为代理对象,即userMappers为代理对象
③. 将代理对象映射到真实对象属性:Whitebox.setInternalState
④. 通过PowerMockito.when来期望代理对象干什么,以及期望返回什么,如:
PowerMockito.when(userMappers.getUsers(“test”).thenReturn(userDtos);
期望userMappers执行getUsers方法,如何访问期望的userDtos对象
⑤. 当真实对象触发同样的方法时,实际执行的时代理代理对象的方法;
代理对象执行方法期望的返回值,即期望值;真实对象执行方法后的返回值,即真实值
所以,当测试userDao.getUsers方法时,通过判断期望值与真实值是否一致,就可以知道测试方法是否正确;