PowerMockito单元测试(1)-主要思想以及常规异常覆盖

        

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方法时,通过判断期望值与真实值是否一致,就可以知道测试方法是否正确;

你可能感兴趣的:(单元测试,单元测试,java,spring,PowerMockito,junit)