Spring Boot 使用MockMvc對象模擬調用Controller


  功能實現之后,我們要養成隨手寫配套單元測試的習慣,這在微服務架構中尤為重要。通常,我們實施微服務架構的時候,已經實現了前后端分離的項目與架構部署。那么在實現后端服務的時候,單元測試是在開發過程中用來驗證代碼正確性非常好的手段,並且這些單元測試將會很好地支持我們未來可能會進行的重構。

 

  編寫controller

package com.xc.springboot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    /**
     * http://127.0.0.1:8081/hello
     */
    @RequestMapping("/hello")
    public String hello() {
        return "hello world!";
    }

}

 

  src/test/下編寫測試類

package com.xc.springboot.controller;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

//引入下面的靜態引用,讓status、content、equalTo函數可用
import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringJUnit4ClassRunner.class)//引入Spring對JUnit4的支持。
// @SpringApplicationConfiguration(classes = SpringbootApplication.class)//指定Spring Boot的啟動類。
@WebAppConfiguration//開啟Web應用的配置,用於模擬ServletContext。
public class HelloControllerTest {

    private MockMvc mvc;

    //·@Before:JUnit中定義在測試用例@Test內容執行前預加載的內容,這里用來初始化對HelloController的模擬。
    @Before
    public void setUp() throws Exception {
        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
    }

    @Test
    public void hello() throws Exception {

        //·MockMvc對象:用於模擬調用Controller的接口發起請求,在@Test定義的hello測試用例中,perform函數執行一次請求調用,accept用於執行接收的數據類型,andExpect用於判斷接口返回的期望值。
        mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("hello world!")));
    }


}

 

  代碼解析如下。

  ·@RunWith(SpringJUnit4ClassRunner.class):引入Spring對JUnit4的支持。

  ·@SpringApplicationConfiguration(classes =SpringbootApplication.class):指定Spring Boot的啟動類。

  ·@WebAppConfiguration:開啟Web應用的配置,用於模擬ServletContext。

  ·MockMvc對象:用於模擬調用Controller的接口發起請求,在@Test定義的hello測試用例中,perform函數執行一次請求調用,accept用於執行接收的數據類型,andExpect用於判斷接口返回的期望值。

  ·@Before:JUnit中定義在測試用例@Test內容執行前預加載的內容,這里用來初始化對HelloController的模擬。

  注意引入下面的靜態引用,讓status、content、equalTo函數可用:

import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

 

版本:spring-boot-starter-parent 1.5.21.RELEASE

參考:Spring Cloud微服務實戰 p51

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM