最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?MVC中的Controller進(jìn)行單元測試的實(shí)現(xiàn)

 更新時間:2022年02月17日 08:58:31   作者:nuccch  
本文主要介紹了如何對Spring?MVC中的Controller進(jìn)行單元測試的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

對Controller進(jìn)行單元測試是Spring框架原生就支持的能力,它可以模擬HTTP客戶端發(fā)起對服務(wù)地址的請求,可以不用借助于諸如Postman這樣的外部工具就能完成對接口的測試。
具體來講,是由Spring框架中的spring-test模塊提供的實(shí)現(xiàn),詳見MockMvc

如下將詳細(xì)闡述如何使用MockMvc測試框架實(shí)現(xiàn)對“Spring Controller”進(jìn)行單元測試,基于Spring Boot開發(fā)框架進(jìn)行驗(yàn)證。
添加測試框架依賴:

<!-- Spring框架 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
!<-- Spring測試框架 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<!-- 文件操作工具 -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

導(dǎo)入靜態(tài)工具方法

為了便于在編寫測試用例時直接調(diào)用測試框架自帶的靜態(tài)方法,首先需要導(dǎo)入這些靜態(tài)工具方法。
需要導(dǎo)入的靜態(tài)方法如下:

import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;
import static org.springframework.test.web.servlet.setup.SharedHttpSessionConfigurer.*;

初始化MockMvc

初始化MockMvc有2種方式:
方式1:明確指定需要測試的“Controller”類進(jìn)行配置
方式2:基于Spring容器進(jìn)行配置,包含了Spring MVC環(huán)境和所有“Controller”類,通常使用這種方式。

@SpringBootTest
public class TestControllerTest {

    MockMvc mockMvc;

    // 初始化MockMvc
    @BeforeEach
    void setUp(WebApplicationContext wac) {
        // 方式1:明確指定需要測試的“Controller”類
        this.mockMvc = MockMvcBuilders.standaloneSetup(new TestController()).build();

        // 方式2:基于Spring容器進(jìn)行配置,包含了Spring MVC環(huán)境和所有“Controller”類。
        this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }
}

另外,還可以對MockMvc進(jìn)行全局配置。

// 全局配置MockMvc
this.mockMvc = MockMvcBuilders.webAppContextSetup(wac)
        .defaultRequest(get("/").accept(MediaType.APPLICATION_JSON)) // 默認(rèn)請求路徑
        .apply(sharedHttpSession()) // 配置session
        .alwaysExpect(status().isOk()) // 預(yù)期響應(yīng)狀態(tài)碼
        .alwaysExpect(content().contentType("application/json;charset=UTF-8")) // 預(yù)期內(nèi)容類型
        .build();

執(zhí)行測試

MockMvc支持對常見的HTTP方法,如:GET,POST,PUT,DELETE等,甚至還支持文件上傳請求。

測試GET接口

// 訪問GET接口:不帶參數(shù)
@Test
public void testSimpleGet() throws Exception {
    MvcResult result = this.mockMvc.perform(get("/test/simple/get")
            .accept(MediaType.APPLICATION_JSON)) // 接受JSON格式響應(yīng)消息
            .andReturn(); // 獲取返回結(jié)果
    Assertions.assertEquals("OK", result.getResponse().getContentAsString());
}

// 訪問GET接口:帶URL參數(shù)
@Test
public void testParamGet() throws Exception {
    int id = 10;
    // 方式1:在URI模板中指定參數(shù)
    //MvcResult result = this.mockMvc.perform(get("/test/param/get?id={id}", id).accept(MediaType.APPLICATION_JSON)).andReturn();

    // 方式2:通過param()方法指定參數(shù)
    //MvcResult result = this.mockMvc.perform(get("/test/param/get").param("id", String.valueOf(id)).accept(MediaType.APPLICATION_JSON)).andReturn();

    // 方式3:通過queryParam()方法指定參數(shù)
    MvcResult result = this.mockMvc.perform(get("/test/param/get").queryParam("id", String.valueOf(id)).accept(MediaType.APPLICATION_JSON)).andReturn();
    Assertions.assertEquals("OK: " + id, result.getResponse().getContentAsString());
}

測試POST接口

// 傳遞表單參數(shù)
@Test
public void testSimplePost() throws Exception {
    int id = 10;

    // 調(diào)用param()方法傳遞參數(shù)
    MvcResult result = this.mockMvc.perform(post("/test/simple/post")
            .param("id", String.valueOf(id))
            .contentType(MediaType.APPLICATION_FORM_URLENCODED)
            .accept(MediaType.APPLICATION_JSON))
            .andReturn();
    Assertions.assertEquals("{\"id\":10}", result.getResponse().getContentAsString());
}

// 傳遞JSON參數(shù)
@Test
public void testSimplePostJson() throws Exception {
    // 調(diào)用content()方法傳遞json字符串參數(shù)
    Subject subject = new Subject();
    subject.setId(10);
    String content = JSON.toJSONString(subject);
    MvcResult result = this.mockMvc.perform(post("/test/simple/post/json")
            .content(content)
            .contentType(MediaType.APPLICATION_JSON)
            .accept(MediaType.APPLICATION_JSON))
            .andReturn();
    Assertions.assertEquals("{\"id\":10}", result.getResponse().getContentAsString());
}

測試文件上傳

@Test
public void testFileUploadSingle() throws Exception {
    File file = new File("C:\\Users\\xxx\\Downloads\\test.jpg");
    String fileName = FilenameUtils.getName(file.getName());
    byte[] bytes = FileUtils.readFileToByteArray(file);
    MockMultipartFile mockMultipartFile = new MockMultipartFile("file", fileName, MediaType.MULTIPART_FORM_DATA_VALUE, bytes);
    this.mockMvc.perform(multipart("/test/upload/single").file(mockMultipartFile))
                .andExpect(status().isOk())
                .andExpect(content().string("OK"))
                .andDo(print());
}

定義預(yù)期結(jié)果

斷言響應(yīng)結(jié)果時,有2種方式:
1.使用JUnit提供的Assert斷言工具判斷返回結(jié)果,這是一種非常普遍和常見的方式
2.在MockMvc框架中可以通過andExpect()方法定義一個或多個預(yù)期結(jié)果,當(dāng)其中一個期望結(jié)果斷言失敗時,就不會斷言其他期望值了

// 使用Junit斷言工具判斷返回結(jié)果是否符合預(yù)期
@Test
public void testAssertResult() throws Exception {
    MvcResult result = this.mockMvc.perform(get("/test/simple/get").accept(MediaType.APPLICATION_JSON)).andDo(print()).andReturn();
    Assert.assertEquals("OK", result.getResponse().getContentAsString());
}

// 在MockMvc框架中定義預(yù)期結(jié)果
@Test
public void testExpectations() throws Exception {
    this.mockMvc.perform(get("/test/simple/get").accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())        // 預(yù)期響應(yīng)狀態(tài)碼為200
            .andExpect(content().string("OK")) // 預(yù)期返回值為字符串“OK”
            .andDo(print());
}

相比于使用Junit的斷言工具判斷返回結(jié)果,在MockMvc框架中直接定義預(yù)期結(jié)果進(jìn)行斷言檢查更加簡潔。

寫在最后

使用Spring提供的測試框架MockMvc可以非常方便地實(shí)現(xiàn)對HTTP服務(wù)接口進(jìn)行單元測試,不要把基礎(chǔ)的功能驗(yàn)證工作都交給測試童鞋,應(yīng)該通過單元測試來保證代碼迭代的穩(wěn)定性。

到此這篇關(guān)于Spring MVC中的Controller進(jìn)行單元測試的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Spring MVC Controller單元測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java設(shè)計模式之策略模式深入刨析

    Java設(shè)計模式之策略模式深入刨析

    策略模式屬于Java 23種設(shè)計模式中行為模式之一,該模式定義了一系列算法,并將每個算法封裝起來,使它們可以相互替換,且算法的變化不會影響使用算法的客戶。本文將通過示例詳細(xì)講解這一模式,需要的可以參考一下
    2022-05-05
  • java頁面中文亂碼的解決辦法

    java頁面中文亂碼的解決辦法

    做java開發(fā)的朋友碰到最多的就是中文亂碼這個問題了,下面介紹頁面提交時與url中文亂碼的一些解決辦法
    2013-11-11
  • java輸入數(shù)字,輸出倒序的實(shí)例

    java輸入數(shù)字,輸出倒序的實(shí)例

    這篇文章主要介紹了java輸入數(shù)字,輸出倒序的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 3行代碼快速實(shí)現(xiàn)Spring Boot Oauth2服務(wù)功能

    3行代碼快速實(shí)現(xiàn)Spring Boot Oauth2服務(wù)功能

    oauthserver是一個基于Spring Boot Oauth2的完整的獨(dú)立的Oauth服務(wù)器。僅僅需要創(chuàng)建相關(guān)數(shù)據(jù)表,修改數(shù)據(jù)庫的連接信息,你就可以得到一個Oauth服務(wù)器。這篇文章給大家介紹3行代碼快速實(shí)現(xiàn)Spring Boot Oauth2服務(wù)功能,需要的朋友參考下吧
    2018-04-04
  • Java虛擬機(jī)運(yùn)行時棧的棧幀

    Java虛擬機(jī)運(yùn)行時棧的棧幀

    本節(jié)將會介紹一下Java虛擬機(jī)棧中的棧幀,會對棧幀的組成部分(局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口)分別進(jìn)行介紹,最后還會通過javap命令反解析編譯后的.class文件,進(jìn)行分析方法執(zhí)行時的局部變量表、操作數(shù)棧等
    2021-09-09
  • Java?Chassis3負(fù)載均衡選擇器技術(shù)解密

    Java?Chassis3負(fù)載均衡選擇器技術(shù)解密

    這篇文章主要為大家介紹了Java?Chassis3負(fù)載均衡選擇器技術(shù)解密,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 詳解Java設(shè)計模式編程中的依賴倒置原則

    詳解Java設(shè)計模式編程中的依賴倒置原則

    這篇文章主要介紹了詳解Java設(shè)計模式中的依賴倒置原則,針對面對對象編程中的抽象的運(yùn)用,需要的朋友可以參考下
    2016-02-02
  • IntelliJ IDEA(2017)安裝和破解的方法

    IntelliJ IDEA(2017)安裝和破解的方法

    這篇文章主要介紹了IntelliJ IDEA(2017)安裝和破解的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 如何兩步解決maven依賴導(dǎo)入失敗的問題

    如何兩步解決maven依賴導(dǎo)入失敗的問題

    這篇文章主要介紹了如何兩步解決maven依賴導(dǎo)入失敗的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • JAVA8 stream中三個參數(shù)的reduce方法對List進(jìn)行分組統(tǒng)計操作

    JAVA8 stream中三個參數(shù)的reduce方法對List進(jìn)行分組統(tǒng)計操作

    這篇文章主要介紹了JAVA8 stream中三個參數(shù)的reduce方法對List進(jìn)行分組統(tǒng)計操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08

最新評論

宿松县| 宜昌市| 禹州市| 灌阳县| 苏尼特右旗| 连江县| 金川县| 大理市| 洛扎县| 阿勒泰市| 东至县| 金溪县| 焦作市| 武城县| 河源市| 长春市| 峨边| 朔州市| 咸阳市| 琼海市| 林口县| 敦化市| 永和县| 惠水县| 鄂州市| 双城市| 红原县| 义乌市| 紫阳县| 平昌县| 深水埗区| 阿勒泰市| 湘潭市| 庆元县| 阳西县| 赞皇县| 拉孜县| 平度市| 延长县| 会昌县| 邵东县|