单元测试(二)——Junit4+EasyMock建立单元测试

添加依赖

pom.xml

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>test</scope>
</dependency>
<dependency>
	<groupId>org.easymock</groupId>
	<artifactId>easymock</artifactId>
	<version>3.1</version>
	<scope>test</scope>
</dependency>

注意依赖scope设置为test,项目打包将忽略test依赖。

测试实现类

BizRefApi.java

	@Slf4j
	@RestController
	@RequestMapping("bizRefApi/")
	public class BizRefApi {
		/**
		 * 业务处理接口 <br>
		 */
		@Resource
		private BizRefService bizRefService;

		/**
		 * 业务缓存处理接口 <br>
		 */
		@Resource
		private BizRefCacheService bizRefCacheService;
		/**
		 * Description: 新增业务关联<br>
		 * 
		 * @author xubin<br>
		 * @taskId <br>
		 * @param addBizRefReq 新增请求参数
		 * @param request HttpServletRequest
		 * @return <br>
		 */
		@PostMapping(value = "/addBizRef")
		public String addBizRef(@RequestBody AddBizRefReq addBizRefReq, HttpServletRequest request) {
			try {
				ValidateUtil.validate(addBizRefReq);
			} catch (Exception e) {
				log.error("addBizRef fail, param : {}, exception : {}", addBizRefReq.toString(), e.getMessage());
				return JsonUtil.getErrorJson(WebConstant.PARAM_EXCEPTION);
			}
			BizRefBO bizRefBO = new BizRefBO();
			BeanUtils.copyProperties(addBizRefReq, bizRefBO);
			bizRefBO.setAppKey(request.getHeader(CommonConstant.APP_KEY));
			bizRefService.save(bizRefBO);
			return JsonUtil.getSucc(WebConstant.OPER_SUCC);
		}
		/**
		 * Description: 查询单个设备对应业务模块的关联对象id<br>
		 * 
		 * @author xubin<br>
		 * @taskId <br>
		 * @param queryBizIdReq 请求参数对象
		 * @param request HttpServletRequest
		 * @return <br>
		 */
		@PostMapping(value = "/v2/queryBizIdSet")
		public String queryBizIdSet(@RequestBody QueryBizIdByDeviceCodeReq queryBizIdReq, HttpServletRequest request) {
			try {
				ValidateUtil.validate(queryBizIdReq);
			} catch (Exception e) {
				log.error("queryBizIdSet fail, param : {}, exception : {}", queryBizIdReq.toString(), e.getMessage());
				return JsonUtil.getErrorJson(WebConstant.PARAM_EXCEPTION);
			}
			Set<String> resList = bizRefCacheService.queryBizIdByDeviceCode(request.getHeader(CommonConstant.APP_KEY), queryBizIdReq.getDeviceCode(),
					queryBizIdReq.getModuleCode());
			return JsonUtil.getSucc4data(resList);
		} 
		/**
		 * set bizRefService
		 * 
		 * @param bizRefService The bizRefService to set. <br>
		 */
		public void setBizRefService(BizRefService bizRefService) {
			this.bizRefService = bizRefService;
		}

		/**
		 * set bizRefCacheService
		 * 
		 * @param bizRefCacheService The bizRefCacheService to set. <br>
		 */
		public void setBizRefCacheService(BizRefCacheService bizRefCacheService) {
			this.bizRefCacheService = bizRefCacheService;
		}

实现类的具体机制不做赘述,此篇主要说下用EasyMock做单元测试,需要注意的是,在实现类里需要对注入的对象(bizRefService 、bizRefCacheService )设置setter方法,用于后面执行单元测试。

单元测试Case

	public class TestBizRefApi {

		/**
		 * Description: 测试添加业务关联<br>
		 * 
		 * @author xubin<br>
		 * @taskId <br>
		 *         <br>
		 */
		@Test
		public void testAddBizRef() {
			// 1.正常执行
			//模拟vo请求参数
			BizRefService bizRefServiceMock = EasyMock.createMock(BizRefService.class);
			HttpServletRequest requestMock = EasyMock.createMock(HttpServletRequest.class);
			bizRefApi.setBizRefService(bizRefServiceMock);
			// 被mock的方法无返回值(void),有返回值需要设置EasyMock.expect期望值
			bizRefServiceMock.save(EasyMock.anyObject());
			// 设置mock对象调用方法期望值
			EasyMock.expect(requestMock.getHeader(CommonConstant.APP_KEY)).andReturn("");
			// 激活mock对象
			EasyMock.replay(bizRefServiceMock);
			EasyMock.replay(requestMock);
			// 执行目标测试方法
			String resJsonStr = bizRefApi.addBizRef(addBizRefReq, requestMock);
			// 校验执行结果
			TestCase.assertEquals(WebConstant.OPER_SUCC, JSONObject.parseObject(resJsonStr).getJSONArray("resMsg").getJSONObject(0).getString("msgCode"));
			// 校验mock对象执行状态
			EasyMock.verify(bizRefServiceMock, requestMock);
			// 2.出现参数异常
			addBizRefReq = new AddBizRefReq();
			// 重置mock对象,需要重新设置mock对象的参数时调用
			// EasyMock.reset(bizRefServiceMock);
			// EasyMock.reset(requestMock);
			resJsonStr = bizRefApi.addBizRef(addBizRefReq, requestMock);
			TestCase.assertEquals(WebConstant.PARAM_EXCEPTION,
					JSONObject.parseObject(resJsonStr).getJSONArray("resMsg").getJSONObject(0).getString("msgCode"));
			EasyMock.verify(bizRefServiceMock, requestMock);
		}

		/**
		 * Description: 测试根据设备编码查询业务id集合<br>
		 * 
		 * @author xubin<br>
		 * @taskId <br>
		 *         <br>
		 */
		@Test
		public void testQueryBizIdSet() {
			// 1.正常执行
			QueryBizIdByDeviceCodeReq queryBizIdReq = new QueryBizIdByDeviceCodeReq();
			queryBizIdReq.setDeviceCode("222");
			queryBizIdReq.setModuleCode("faceset");
			BizRefApi bizRefApi = new BizRefApi();
			BizRefCacheService bizRefCacheServiceMock = EasyMock.createMock(BizRefCacheService.class);
			HttpServletRequest requestMock = EasyMock.createMock(HttpServletRequest.class);
			bizRefApi.setBizRefCacheService(bizRefCacheServiceMock);
			EasyMock.expect(requestMock.getHeader(CommonConstant.APP_KEY)).andReturn("");
			Set<String> resSet = Sets.newHashSet();
			resSet.add("1");
			EasyMock.expect(bizRefCacheServiceMock.queryBizIdByDeviceCode(EasyMock.anyObject(), EasyMock.anyObject(), EasyMock.anyObject()))
					.andReturn(resSet);
			EasyMock.replay(bizRefCacheServiceMock);
			EasyMock.replay(requestMock);
			String resJsonStr = bizRefApi.queryBizIdSet(queryBizIdReq, requestMock);
			TestCase.assertEquals(1, JSONObject.parseObject(resJsonStr).getJSONArray("resData").size());
			EasyMock.verify(bizRefCacheServiceMock, requestMock);
			// 2.出现参数异常
			queryBizIdReq = new QueryBizIdByDeviceCodeReq();
			resJsonStr = bizRefApi.queryBizIdSet(queryBizIdReq, requestMock);
			TestCase.assertEquals(WebConstant.PARAM_EXCEPTION,
					JSONObject.parseObject(resJsonStr).getJSONArray("resMsg").getJSONObject(0).getString("msgCode"));
			EasyMock.verify(bizRefCacheServiceMock, requestMock);
		}

常用到的EasyMock方法:
EasyMock.createMock:新建mock对象
EasyMock.expect(m).andReturn(v):设置m方法执行期望返回值为v
EasyMock.expect(m).andThrow(Throwable throwable):设置m方法执行抛出异常
EasyMock.replay:激活mock对象
EasyMock.verify:校验mock对象是否执行
EasyMock.reset:重置mock对象

单元测试覆盖率

笔者使用eclipse插件EclEmma查看单元测试覆盖率

  • 用插件运行单元测试:

  • 在测试类中可以看到覆盖情况,绿色表示被覆盖,红色表示未被覆盖到:

转载于:https://my.oschina.net/u/872813/blog/2878771

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值