首頁>技術>

SpringBoot微服務應用使用JUint5做介面測試

SpringBoot2.x中我們可以很方便地整合Junit5.x進行介面測試和單元測試。本節內容主要說一下介面測試。

第一步,引入依賴

        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>

沒錯只需要這一個依賴足以。

第二步,我們可以針對Controller生成測試類

這裡講一下IDEA中的步驟:

1、開啟Controller類

2、游標定位在類名上

3、按Alt+Enter

4、選擇“Create Test”

5、勾選要進行介面測試的方法

6、確定,即可自動生成測試類

自動生成的測試儀器如下圖:

第三步,添加註解支撐。

在我們的測試類上添加註解:

package com.xtoad.ecms.baseinfo.controller;import org.junit.jupiter.api.Test;import org.junit.jupiter.api.extension.ExtendWith;import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.annotation.Rollback;import org.springframework.test.context.junit.jupiter.SpringExtension;import org.springframework.transaction.annotation.Transactional;import static org.junit.jupiter.api.Assertions.*;@SpringBootTest@ExtendWith(SpringExtension.class)@AutoConfigureMockMvc@Transactional@Rollback(value = false)class UserControllerTest {    @Test    void getAllUser() {    }    @Test    void getUserById() {    }    @Test    void getUserWithName() {    }    @Test    void insertUser() {    }    @Test    void updateUser() {    }    @Test    void deleteUser() {    }    @Test    void batchAddUser() {    }    @Test    void batchUpdUser() {    }    @Test    void batchDelUser() {    }}

各個註解的含義如下:

@SpringBootTest

啟動SpringBoot工程,並且測試程式碼中可以使用Spring容器自動注入等操作,若無此此註解,則不會啟動SpringBoot工程

@ExtendWith(SpringExtension.class)

啟用在測試中使用Spring測試框架功能(例如)`@MockBean`

@AutoConfigureMockMvc

開啟自動配置MockMvc,用於介面請求

@Transactional

開啟事務,這樣測試程式碼執行完畢會自動回滾所有的資料庫變更,這樣不會影響我們實際使用的資料

@Rollback(value = false)

該註解可以讓事務不回滾,會保留介面測試的資料庫變更,預設是true

接著我們可以寫介面測試程式碼了。

核心物件有兩個:MockMvc和RequestBuilder。

RequestBuilder:用於構建一個Http請求,包含請求的Url,Method,ContentType,Header,Body等。

MockMvc:用於介面請求的傳送和接收返回,自動會請求當前Springboot應用的服務。

下面以其中一個介面為例:

package com.xtoad.ecms.baseinfo.controller;import com.fasterxml.jackson.core.type.TypeReference;import com.xtoad.ecms.baseinfo.dto.RoleDTO;import com.xtoad.ecms.baseinfo.dto.UserDTO;import com.xtoad.ecms.baseinfo.enums.Sex;import com.xtoad.ecms.common.utils.JsonUtils;import com.xtoad.ecms.common.web.base.Result;import org.junit.jupiter.api.Test;import org.junit.jupiter.api.extension.ExtendWith;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.http.MediaType;import org.springframework.test.context.junit.jupiter.SpringExtension;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.RequestBuilder;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.result.MockMvcResultHandlers;import org.springframework.transaction.annotation.Transactional;import java.util.ArrayList;import java.util.List;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;@SpringBootTest@ExtendWith(SpringExtension.class)@AutoConfigureMockMvc@Transactionalclass UserControllerTest {    private static final Logger LOGGER = LoggerFactory.getLogger(UserControllerTest.class);    @Autowired    private MockMvc mockMvc;    // 測試介面的Url    private String baseUrl = "/user";    @Test    void getUserById() throws Exception {        // 測試介面的請求引數        String url = baseUrl + "/1";        // 建立Http請求物件        RequestBuilder request = MockMvcRequestBuilders.get(url) // Method:GET Url:/user/1                .accept(MediaType.APPLICATION_JSON) // Accept:application/json                .header("TOKEN", "tokenstring") // 設定Header                .content("") // Body:空                .contentType(MediaType.APPLICATION_JSON); // ContentType:application/json        // 發起介面請求並驗證結果        MvcResult mvcResult = this.mockMvc.perform(request) // 傳送請求                .andExpect(status().isOk()) // 驗證返回的http Status = 200                .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) // 驗證返回結果型別是application/json;charset=UTF-8                .andDo(MockMvcResultHandlers.print()) // 列印返回結果                .andExpect(jsonPath("$.code").value("000000")) // 驗證返回結果中的code == 000000                .andExpect(jsonPath("$.data.id").value(1))// 驗證返回結果中的data 物件中的id  == 1                .andReturn();        LOGGER.info(mvcResult.getResponse().getContentAsString());    }}

我們執行測試方法:

執行結果如下:

完整原始碼地址:https://gitee.com/xtoad/ecms-java.git

12
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • wordpress主題網站多站點實現自動同步文章純程式碼實現