在SpringBoot中使用MockMvc和Junit進行單元測試

Mock

在面向對象的程序設計中,模擬對象(英語:mock object)是以可控的方式模擬真實對象行爲的假對象。在編程過程中,通常通過模擬一些輸入數據,來驗證程序是否達到預期結果。
使用Mockito一般分三個步驟:
1、模擬測試類所需的外部依賴;
2、執行測試代碼;
3、判斷執行結果是否達到預期。

MockMvc

基於RESTful風格的SpringMVC單元測試,可以測試完整的SpringMVC流程,即從URL請求到控制處理器,帶到視圖渲染都可以測試。MockMvc是由spring-test包提供,實現了對Http請求的模擬訪問

MockMvcBuilder接口,提供一個唯一的build方法,用來構造MockMvc
主要有兩個實現:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分別對應兩種測試方式,即獨立安裝和集成Web環境測試(並不會集成真正的web環境,而是通過相應的Mock API進行模擬測試,無須啓動服務器)。

MockMvcBuilders提供了對應的創建方法standaloneSetup方法和webAppContextSetup方法,在使用時直接調用即可。

SpringBoot中使用MockMvc

第一步:引入jar包。創建SpringBoot項目中默認引入的spring-boot-starter-test間接引入了spring-test,因此無需再額外引入jar包。

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

第二步:創建HelloWorldController類,並提供test方法作爲待測試的業務接口。

package com.text.mockmvc.controller;

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

@RestController
public class Controller {
	
    @RequestMapping("/test")
    @GetMapping
    public String test(){
        return "hello mock mvc";
    }
    
    @RequestMapping("/delete")
    @DeleteMapping
    public void delete(){
        System.out.println("刪除成功!");
    }
}

**第三步:編寫測試類。**相關解釋在代碼中進行了詳細註釋

package com.text.mockmvc;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
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 org.springframework.web.context.WebApplicationContext;

@RunWith(SpringRunner.class)
@WebAppConfiguration
@SpringBootTest(classes = SpringTestMockmvcApplication.class)
public class SpringTestMockmvcApplicationTests {

	@Autowired
	private WebApplicationContext wac;

	private MockMvc mockMvc;

	@Before
	public void setUp() throws Exception {
		this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
	}

	@Test
	public void contextLoads() throws Exception {
		MvcResult mvcResult = mockMvc.perform(
				 MockMvcRequestBuilders.get("/test") // 構建get方式來調用接口
				 // MockMvcRequestBuilders.get("/delete") // 構建get方式來調用接口
				 .contentType(MediaType.APPLICATION_JSON_UTF8) // 設置請求參數的類型
				 .param("hello", "world")// 構建請求參數
		).andExpect(MockMvcResultMatchers.status().isOk())//添加ResultMatcher驗證規則,驗證控制器執行完成後結果是否正確
	     .andReturn();//最後返回相應的MvcResult;然後進行自定義驗證/進行下一步的異步處理。
		
		System.out.println("執行後的mvcResult:------" + mvcResult.getResponse().getContentAsString());
	}
}

執行結果如下圖所示:
在這裏插入圖片描述

SpringBoot中使用Junit

前面配置不變,只需要更改測試類即可。

package com.text.mockmvc;

import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.text.mockmvc.controller.Controller;

@RunWith(SpringRunner.class)
//注意這裏一定要是程序主類名SpringTestMockmvcApplication
@SpringBootTest(classes = SpringTestMockmvcApplication.class)
public class SpringJunitTest {
	
	@Autowired
	private Controller controller;
	
	@Test
	public void testTest() {
	    //執行控制層的test方法
		System.out.println(controller.test());
	}

	@Test
	public void  testDelete() {
	    //執行控制層的delete方法
		controller.delete();
	}
}

執行結果如下圖所示:
在這裏插入圖片描述

注意:如果需要測試包含Shiro Subject的控制層方法,請參考下篇博客
MockMVC登錄後測試SpringBoot項目包含Shiro Subject的控制層方法

參考博客如下:
在SpringBoot中使用MockMvc進行單位測試
MockMvc進行單元測試
SpringBoot基礎之MockMvc單元測試
mockMvc使用教程

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