pom.xmljava
<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方法,用于后面执行单元测试。app
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
笔者使用eclipse插件EclEmma查看单元测试覆盖率单元测试