【IDEA開發SpringBoot2.0】使用Mockito進行常規接口測試#05



前言1

什麼是Mockito?

Mockito是GitHub上使用最廣泛的Mock框架,並與JUnit結合使用.Mockito框架可以創建和配置mock對象.使用Mockito簡化了具有外部依賴的類的測試開發!

什麼是Mock?

在面向對象程序設計中,模擬對象(英語:mock object,也譯作模仿對象)是以可控的方式模擬真實對象行爲的假的對象。程序員通常創造模擬對象來測試其他對象的行爲,很類似汽車設計者使用碰撞測試假人來模擬車輛碰撞中人的動態行爲。
也就是用來做程序測試的。

爲什麼要使用Mock?

因爲有些時候,你很難再現真實的情況,例如:

真實對象的行爲是不確定的(例如,當前的時間或當前的溫度);
真實對象很難搭建起來;
真實對象的行爲很難觸發(例如,網絡錯誤);
真實對象速度很慢(例如,一個完整的數據庫,在測試之前可能需要初始化);
真實的對象是用戶界面,或包括用戶界面在內;
真實的對象使用了回調機制;
真實對象可能還不存在;
真實對象可能包含不能用作測試(而不是爲實際工作)的信息和方法。

舉一個簡單的例子:如果你的程序需要傳一個特定時間進行測試,你真的要等到那個時間嗎?你不會這樣做,而是模擬那個時間傳過去

用PostMan與用Mock有什麼區別?

經常做測試的肯定對PostMan都不陌生,PostMan是一個專門測試 API 的工具。
爲什麼我們要選用Mock做測試呢?
首先,PostMan相當於一個客戶端(pm),在測試之前你需要先啓動你的服務端(srever),相當於是一個客戶端的測試
Mock是運行在服務端上的,Mock的作用就是模擬客戶端的行爲
區別在於Mock省去了網絡請求的環節,提高了測試的效率
其次Mock是用編碼實現的,PostMan是用真實的網絡請求+客戶端實現的
還有一個問題,我們在公司中一般都是自動化的單元測試,跑通之後自動打包發佈,Mock可以實現但PostMan就不行了

正題

使用Mockito做一個模擬測試

編寫代碼

1.在Test目錄的包下新建一個test包
在這裏插入圖片描述
在這裏插入圖片描述
2.創建一個MockitoTest類,代碼如下

package com.moli.zy.springboot2ml.test;

import com.moli.zy.springboot2ml.controller.ArticleRestController;
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpMethod;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;


@Slf4j
@SpringBootTest
public class MockitoTest {

    private MockMvc mockMvc;

    @Before
    public void setUp() {
        mockMvc = MockMvcBuilders.standaloneSetup(new ArticleRestController()).build();
    }

    @Test
    public void saveArticle() throws Exception {

        String article = "{\n" +
                "    \"id\": 1,\n" +
                "    \"author\": \"moli\",\n" +
                "    \"title\": \"這是標題\",\n" +
                "    \"content\": \"這是內容\",\n" +
                "    \"createTime\": \"2019-08-21 12:30:56\",\n" +
                "    \"reader\":[{\"name\":\"moli1\",\"age\":18},{\"name\":\"moli2\",\"age\":19}]\n" +
                "}";
        MvcResult result = mockMvc.perform(MockMvcRequestBuilders.request(HttpMethod.POST, "/rest/article")
                .contentType("application/json").content(article))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$.data.author").value("moli"))
                .andExpect(MockMvcResultMatchers.jsonPath("$.data.reader[0].age").value(18))
                .andDo(print())
                .andReturn();

        log.info(result.getResponse().getContentAsString());

    }
}

開始測試

可以看到測試沒有問題,接下來講解代碼
在這裏插入圖片描述

代碼講解

@SpringBootTest註解

是用來創建Spring的上下文ApplicationContext,保證測試在上下文環境裏運行。單獨使用@SpringBootTest不會啓動servlet容器。不可以使用@Resource和@Autowired等進行依賴注入(準確的說是可以使用,但被註解的bean爲null)

在這裏插入圖片描述
在測試方法執行之前,需要先構建一個MockMvc對象,作用就是幫助我們模擬網絡請求進行測試
在這裏插入圖片描述
這個方法就是測試的內容了
在這裏插入圖片描述
article變量存的是請求接口時要傳輸的數據
在這裏插入圖片描述
可以看到 MockMvcRequestBuilders.request 有兩個參數,分別是請求的類型,和請求的地址
在這裏插入圖片描述
上圖請求的地址對應的Controller方法如圖所示
在這裏插入圖片描述
contentType 用於定義發送的數據類型以及發送的對象
在這裏插入圖片描述
這三行是定義我們所期待的結果,如果不符合那麼本次測試就會失敗

在這裏插入圖片描述

上圖三行的詳細解釋:
第一行:要求狀態碼必須是200(成功狀態), 否則測試失敗
第二行:要求返回的數據中data下的author 必須爲 moli , 否則測試失敗
第三行:要求返回的數據中data下的第一個reader下的age 必須爲 18 ,否則測試失敗

andDo 表示打印
在這裏插入圖片描述
andReturn 表示將結果返回
在這裏插入圖片描述


本節教程結束


這是我通過學習對知識的整理及備忘,本博客的所有內容,僅是自己的一些學習筆記,如有錯誤,歡迎指正。如有侵權,請告知修改。


  1. 前言部分內容摘選自:https://www.jianshu.com/p/eae0187900f8 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章