背景
Java的單元測試可以使用多個框架,其中比較流行的包括:
- JUnit:JUnit是Java單元測試最常用的框架,它提供了一套豐富的API,可以方便地編寫測試用例和測試套件。JUnit 5是JUnit的最新版本,引入了許多新功能和改進。
- Mockito:Mockito是一個模擬框架,可以模擬對象的行為和狀態,以便在單元測試中檢查方法的調用和參數。它提供了一組強大的API,可以方便地創建模擬對象和驗證方法調用。
- Spring Test:如果你正在使用Spring框架開發應用程序,那么可以使用Spring Test框架進行單元測試。Spring Test提供了一套完整的測試解決方案,可以方便地測試Spring應用程序的各種方面。
Spring Boot Test的主要特點包括:
- 快速創建測試環境:通過使用Spring Boot的自動化配置功能,可以快速創建測試環境,無需手動配置。
- 提供豐富的測試功能:Spring Boot Test提供了豐富的測試功能,包括注解支持、MockMvc、RestTemplate等,可以方便地進行單元測試和集成測試。
- 集成JUnit和Mockito:Spring Boot Test集成了JUnit和Mockito等測試框架和模擬框架,可以方便地編寫測試用例和模擬對象。
- 簡化測試配置:通過使用Spring Boot的自動化配置功能,可以簡化測試配置,只需關注測試用例的編寫。
Spring Boot Test 包含了這些庫
- JUnit 5:包含兼容JUnit4,Java 應用程序單元測試的事實標準
- Spring Test 和 SpringBootTest:對Spring Boot應用程序的公共和集成測試支持
- AssertJ:流式斷言庫
- Hamcrest:匹配對象庫
- Mockito:Java 模擬框架
- JSONassert:JSON 斷言庫
- JsonPath: JSON XPath
MockMvc概念
MockMvc是Spring Test模塊的一部分,它允許我們對Spring MVC控制器進行單元測試,而無需啟動完整的Spring應用上下文。
MockMvc可以模擬HTTP請求和響應,MockMvc就像是一個虛擬的Spring MVC,能夠讓我們快速測試控制器。
MockMVC的基本步驟
(1) mockMvc.perform執行一個請求。
(2) MockMvcRequestBuilders.get(“XXX”)構造一個請求。
(3) ResultActions.param添加請求傳值
(4) ResultActions.accept()設置返回類型
(5) ResultActions.andExpect添加執行完成后的斷言。
(6) ResultActions.andDo添加一個結果處理器,表示要對結果做點什么事情,比如處使用print()輸出整個響應結果信息。
(7) ResultActions.andReturn表示執行完成后返回相應的結果。
實例化
方法一:通過參數指定一組控制器,這樣就不需要從上下文獲取
了
mockMvC = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();
方法二:指定WebApplicationContext 將會從該上下文獲得相應的控制器并得到相應的MockMvc
mockMVC=MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
步驟
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
1、雙擊選中你要測試的類,點擊 Navigate
2、注意點擊 Test 的時候鼠標要放在對應的類上
3、勾選你想要的
這時候生成的代碼是這樣的
package com.zhangyu.controller;import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;class HelloWorldControllerTest {@BeforeEachvoid setUp() {}@AfterEachvoid tearDown() {}@Testvoid index() {}
}
根據上面的 MockMVC的基本步驟 我們編寫代碼
package com.zhangyu.controller;import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class HelloWorldControllerTest {private MockMvc mvc;@BeforeEachvoid setUp() throws Exception {mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();}@Testvoid index() throws Exception {mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();}
}
稍微解釋一下這個幾個新的注解:
- @SpringBootTest:獲取啟動類,加載配置,尋找主配置啟動類(被 @SpringBootApplication 注解的)
- @RunWith(SpringRunner.class):讓JUnit運行Spring的測試環境,獲得Spring環境的上下文的支持。