開始使用mock進行模塊化單元測試

引入mock依賴,3版本以上支持了模擬final所修飾的對象

            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-core</artifactId>
                <version>3.3.3</version>
                <scope>test</scope>
            </dependency>

使用mock做controller層測試

  • controller類名為AlertRuleController
  • AlertRuleController里面有引入Curd對象
// 先mock出來引入的curd對象
@Mock
private Curd curd;

// 再注入要測試的controller
@InjectMocks
private AlertRuleController alertRuleController

// 實例化當前類里面的注解以及將要測試的controller加入上下文
private MockMvc mvc;

@Before
public void setUp() {
  MockitoAnnotations.initMocks(this);
  mvc = MockMvcBuilders.standaloneSetup(alertRuleController).build();
}
  • 上面就是開始測試前的準備的工作,完成對象模擬以及初始化好要測試的類
  • 接下來我們進入測試環(huán)境,先看下我的實現(xiàn)類,里面有哪些需要mock行為
image.png
  • 整個方法比較簡單,主要是紅線框需要模擬,因為它是一個查詢數(shù)據(jù)庫的代碼,我們只是單純進行模塊測試,肯定拿不到數(shù)據(jù)庫數(shù)據(jù)
// mock 行為,這一塊根據(jù)實際業(yè)務(wù)來,我的僅供參考
QueryListResult queryListResult = new QueryListResult();
List<Record> list = new ArrayList<>();
list.add(new SimpleRecord() {{put(StandardField.CONTENT, CONTENT);}});
queryListResult.setList(list);
queryListResult.setCount(1);
// when后面就是紅框代碼,thenReturn就是期望的結(jié)果,這里我對參數(shù)不感興趣,所以全部是any()
Mockito.when(curd.queryListResult(any(), any())).thenReturn(queryListResult);

// 執(zhí)行g(shù)et請求
mvc.perform(MockMvcRequestBuilders.get("/alert/rule")).andExpect(MockMvcResultMatchers.status().is(200)).andReturn()

常見問題

  • 上面的章節(jié)可以幫忙快速入門,接下來說一下我開始引入mock測試框架遇到的一些問題

  • 依賴問題

        <!-- 測試mvc所需 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
  • 沒有返回想要的期望值,期望值為null
    mock行為的時候,需要注意參數(shù),匹配上才會返回期望值,如果對參數(shù)不感興趣,全部設(shè)置成any()即可

  • 再補充一點,post請求

        mockMvc.perform(post(path).with(request -> {
            request.setContent(new Gson().toJson(alertRule).getBytes());
            request.setContentType("application/json");
            return request;
        }));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容