PowerMockito单元测试(2)-返回void的方法测试覆盖

  

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);执行正确

   所以,要知道真实方法执行完后,执行到了哪来,尽量的与代理方法相关联来验证,实在没有那就不验证了。

  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值