單元測試(二)——Junit4+EasyMock創建單元測試

添加依賴

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

單元測試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

單元測試覆蓋率

筆者使用eclipse插件EclEmma查看單元測試覆蓋率單元測試

  • 用插件運行單元測試:

  • 在測試類中能夠看到覆蓋狀況,綠色表示被覆蓋,紅色表示未被覆蓋到:
相關文章
相關標籤/搜索