添加依赖
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查看单元测试覆盖率
- 用插件运行单元测试:
- 在测试类中可以看到覆盖情况,绿色表示被覆盖,红色表示未被覆盖到: