網易考拉mock框架
來自專欄網易雲社區4 人贊了文章
本文來自網易雲社區
作者:程漢
前言
mock在概念大家都不陌生,隨著系統依賴增多,需要使用mock的手段來保證單元測試的健壯性,mock的各種好處這裡就不用一一贅述了。平常使用的mock框架比如EasyMock,mockito在實際運用中總會有那麼一點不方便,為此產生了在這些mock框架基礎之上,做一點點小優化的想法。
mockito與haitao-mock對比
mockito示例
package com.netease.kaola.mock.test;import org.mockito.InjectMocks;import org.mockito.Mock;import org.mockito.Mockito;import org.mockito.MockitoAnnotations;import org.testng.Assert;import org.testng.annotations.AfterClass;import org.testng.annotations.BeforeClass;import org.testng.annotations.Test;import com.netease.kaola.mock.test.bean.Father;import com.netease.kaola.mock.test.bean.Grandson;/** * Created by chenghan on 17/9/18. */public class TypeMockMokitoTest { private static final String MOCK_NAME = "mock grandson"; /** * mockito原生註解,表明待做mock分析的入口類,分析後滿足條件的欄位會被替換為mock後的實現 */ @InjectMocks private Father father = new Father(); /** * 按照類型做mock,會替換入口類所有類型匹配的欄位(包括嵌套類的欄位),返回值默認都是null */ @Mock private Grandson grandson; @BeforeClass public void beforeClass() { MockitoAnnotations.initMocks(this); } @AfterClass public void afterClass() { } @Test public void mokito類型匹配mock() { String mokitoReturn = "mokito"; Mockito.when(grandson.name()).thenReturn(mokitoReturn); String result = father.getGrandsonOfFather().name(); Assert.assertTrue(result.equals(mokitoReturn)); result = father.getSon().getGrandson().name(); Assert.assertTrue(result.equals(mokitoReturn)); }}
mockito可以支持註解方式,按照類型進行註解對象替換,如果我們要替換的對象都很規矩的話,那麼到此mockito已經可以基本解決我們的mock需求了。但是,我們想要mock的對象一般都是dubbo 介面,dubbo介面的類型可就不那麼「規矩」了,會被代理為形如 com.alibaba.dubbo.common.bytecode.proxyXX」的類型,那麼mockito的類型替換就失效了。此外,mockito不支持按照欄位名替換,也沒辦法一鍵恢復到mock之前的狀態
haitao-mock框架在mockito基礎之上做了一下增強優化,對比如下。
haitao-mock框架
功能說明
1.兼容mockito所有功能
2.提供註解方式按照欄位名進行mock替換
3.提供註解方式按照欄位類型替換,ps.包括各種代理類
4.提供一鍵clear恢復mock之前的狀態
使用示例
pom依賴
<dependency> <groupId>com.netease.haitao</groupId> <artifactId>haitao-mock</artifactId> <version>1.0.6</version> <scope>test</scope></dependency>
初始化
可以選擇在父類初始化mock框架,這樣一個測試用例類執行完之後可以默認恢復到mock之前的狀態,不會和其他用例相互影響。
/** * 測試抽象類 Created by chenghan on 17/7/3. */public abstract class AbstractTestClass {@BeforeClass public void beforeClass() { // 初始化mock框架 MockController.mockStart(this); }@AfterClass public void afterClass() { // 用例執行完,清理並回復到mock之前的場景 MockController.mockClear(this); }}
按照欄位名替換
/** * Created by chenghan on 17/7/4. */public class NameMockTest extends AbstractTestClass { private static final String MOCK_NAME = "mock grandson"; /** * mockito原生註解,表明待做mock分析的入口類,分析後滿足條件的欄位會被替換為mock後的實現 */ @InjectMocks private Father father = new Father(); /** * 按照欄位名做mock */ @NameMock(mockFieldName = "grandsonOfFather") private Grandson grandson = EasyMockBoostUtils.buildMock(new EasyMockBoostUtils.MockTemplate() { public Grandson buildMock() { Grandson mockGrandSon = EasyMock.createMock(Grandson.class); EasyMock.expect(mockGrandSon.name()).andReturn(MOCK_NAME).anyTimes(); EasyMock.replay(mockGrandSon); return mockGrandSon; } }); @Test public void 欄位名mock() { String result = father.getGrandsonOfFather().name(); Assert.assertTrue(result.equals(MOCK_NAME)); result = father.getSon().getGrandson().name(); Assert.assertTrue(!result.equals(MOCK_NAME)); }}
按照欄位類型替換
/** * Created by chenghan on 17/7/4. */public class TypeNestMockTest { private static final String MOCK_NAME = "mock grandson"; /** * mockito原生註解,表明待做mock分析的入口類,分析後滿足條件的欄位會被替換為mock後的實現 */ @InjectMocks private Father father = new Father(); /** * 按照類型做mock,會替換入口類所有類型匹配的欄位(包括嵌套類的欄位) */ @TypeMock private Grandson grandson = EasyMockBoostUtils.buildMock(new EasyMockBoostUtils.MockTemplate() { public Grandson buildMock() { Grandson mockGrandSon = new Grandson(); Mockito.when(mockGrandSon.name()).thenReturn(MOCK_NAME); return mockGrandSon; } }); @BeforeClass public void beforeClass() { MockController.mockStart(this); } @AfterClass public void afterClass() { MockController.mockClear(this); } @Test public void haitaoMock類型匹配mock() { String result = father.getGrandsonOfFather().name(); Assert.assertTrue(result.equals(MOCK_NAME)); result = father.getSon().getGrandson().name(); Assert.assertTrue(result.equals(MOCK_NAME)); }}
原文:考拉mock框架
了解網易雲 :
網易雲官網:https://www.163yun.com
網易雲免費體驗館,0成本體驗20+款雲產品!
更多網易研發、產品、運營經驗分享請訪問網易雲社區。
推薦閱讀:
TAG:網易 | mockserver | 網易雲 |