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使用教程