SpringBoot中@Test的介紹和使用案例
SpringBoot Test介紹
SpringBoot提供了方便的測(cè)試功能,可以很容易地進(jìn)行單元測(cè)試和集成測(cè)試。主要包含以下幾點(diǎn):
- Spring Boot提供了@SpringBootTest注解,可以用來啟動(dòng)Spring Boot應(yīng)用,進(jìn)行集成測(cè)試。
- Spring Boot提供了@MockBean注解,可以用來 Mock Bean。
- Spring Boot提供了@SpyBean注解,可以用來 Spy Bean。
- Spring Boot提供了@SpringBootConfiguration注解,可以用來聲明配置類。
- Spring Boot提供了AssertJ的支持,可以用來進(jìn)行斷言。
- Spring Boot提供了測(cè)試相關(guān)的工具類,如TestRestTemplate等。
- SpringBoot提供了@LocalServerPort可以非常方便的模擬客戶端,對(duì)運(yùn)行的服務(wù)進(jìn)行端到端集成測(cè)試
- SpringBoot提供了自動(dòng)配置MockMvc,方便在測(cè)試類中直接注入并使用MockMvc
依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
常用注解
@SpringBootTest
這個(gè)注解用來進(jìn)行集成測(cè)試,會(huì)啟動(dòng)整個(gè)Spring Boot應(yīng)用,進(jìn)行端到端測(cè)試。
用法:
@SpringBootTest
public class MyTest {
// 測(cè)試方法
}可以通過webEnvironment參數(shù)來指定測(cè)試環(huán)境:
- MOCK:加載Web Application Context,不啟動(dòng)Servlet容器。
- RANDOM_PORT:加載Servlet容器,使用隨機(jī)端口。
- DEFINED_PORT:加載Servlet容器,使用定義好的端口。
- NONE:加載Web Application Context,但是不啟動(dòng)Servlet容器。
@WebMvcTest
這個(gè)注解用來測(cè)試Web層,會(huì)自動(dòng)注入Web層的Bean,不會(huì)啟動(dòng)整個(gè)Spring Boot應(yīng)用。
用法:
@WebMvcTest(UserController.class)
public class MyTest {
@Autowired
private MockMvc mvc;
// 測(cè)試方法
}@DataJpaTest
這個(gè)注解用來測(cè)試JPA相關(guān)的Bean,會(huì)自動(dòng)配置Spring Data JPA相關(guān)的Bean。
用法:
code@DataJpaTest
public class MyTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private UserRepository userRepository;
// 測(cè)試方法
}@MockBean
這個(gè)注解用來Mock一個(gè)Bean,注入測(cè)試類中,用來Isolation測(cè)試。
用法:
@SpringBootTest
public class MyTest {
@MockBean
private UserService userService;
// 測(cè)試方法
}@SpyBean
這個(gè)注解用來Spy一個(gè)Bean,注入測(cè)試類中,不影響真正的Bean。
用法:
@SpringBootTest
public class MyTest {
@MockBean
private UserService userService;
// 測(cè)試方法
}@SpringBootConfiguration
這個(gè)注解用來聲明配置類,相當(dāng)于@Configuration。
用法:
@SpringBootConfiguration
public class MyConfig {
// 配置代碼
}可以用在測(cè)試類中加載額外的配置類。
@LocalServerPort
這個(gè)是一個(gè)非常有用的注解,它可以為測(cè)試獲取啟動(dòng)的嵌入式服務(wù)器實(shí)例的實(shí)際端口號(hào)。
主要作用和用法如下:
自動(dòng)注入啟動(dòng)的服務(wù)器端口號(hào)
在測(cè)試類中,可以像下面這樣使用@LocalServerPort注解:
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class MyTest {
@LocalServerPort
private int port;
// 測(cè)試方法可以使用port變量
}這樣就可以拿到隨機(jī)分配的端口號(hào)。
結(jié)合@Value使用
@LocalServerPort也可以和@Value結(jié)合使用:
@Value("${local.server.port}")
private int port;測(cè)試端點(diǎn)
有了端口號(hào),可以通過測(cè)試端點(diǎn)進(jìn)行驗(yàn)證:
@Autowired
private TestRestTemplate restTemplate;
@Test
public void test() {
String body = this.restTemplate.getForObject("http://localhost:" + port + "/hello", String.class);
assertEquals("Hello World", body);
}模擬客戶端
使用@LocalServerPort可以非常方便的模擬客戶端,對(duì)運(yùn)行的服務(wù)進(jìn)行端到端集成測(cè)試。
@AutoConfigureMockMvc
這個(gè)是Spring Boot提供的一個(gè)便捷的注解,可以用來自動(dòng)配置MockMvc,方便在測(cè)試類中直接注入并使用MockMvc。
主要作用如下:
自動(dòng)注入MockMvc
在測(cè)試類中,可以直接注入MockMvc:
@Autowired private MockMvc mvc;
不需要自己配置MockMvc。
結(jié)合@WebMvcTest使用
@AutoConfigureMockMvc經(jīng)常和@WebMvcTest一起使用,對(duì)控制器進(jìn)行單元測(cè)試:
@WebMvcTest
@AutoConfigureMockMvc
public class TestController {
@Autowired
private MockMvc mvc;
@MockBean
private UserService userService;
@Test
public void test() throws Exception {
// 使用MockMvc進(jìn)行請(qǐng)求測(cè)試
}
}模擬HTTP請(qǐng)求
有了MockMvc,可以輕松模擬各種HTTP請(qǐng)求來測(cè)試控制器:
// GET
mvc.perform(get("/users"))
.andExpect(status().isOk());
// POST
mvc.perform(post("/users"))
.andExpect(status().isCreated());
// 模擬參數(shù)
mvc.perform(get("/users").param("name", "test"))
.andExpect(content().string(containsString("test")));驗(yàn)證響應(yīng)
可以通過MockMvc對(duì)響應(yīng)結(jié)果進(jìn)行驗(yàn)證:
mvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.name").value("Test User")); 總之,@AutoConfigureMockMvc可以靈活地模擬HTTP請(qǐng)求,并驗(yàn)證響應(yīng),使得測(cè)試Web層變得非常方便。它通常與@WebMvcTest注解配合使用,為 Spring Boot的測(cè)試提供了很大的便利。
到此這篇關(guān)于SpringBoot中@Test的介紹和使用的文章就介紹到這了,更多相關(guān)SpringBoot @Test使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis-Plus多數(shù)據(jù)源配置與讀寫分離全過程
文章介紹了如何在SpringBoot中使用MyBatis-Plus實(shí)現(xiàn)多數(shù)據(jù)庫操作,包括純粹多庫和讀寫分離的配置方法,重點(diǎn)演示了多數(shù)據(jù)源的設(shè)置與使用2025-09-09
java Unicode和UTF-8之間轉(zhuǎn)換實(shí)例
這篇文章主要介紹了java Unicode和UTF-8之間轉(zhuǎn)換實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
java springmvc 注冊(cè)中央調(diào)度器代碼解析
這篇文章主要介紹了java springmvc 注冊(cè)中央調(diào)度器代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Springboot 在普通類型注入Service或mapper
這篇文章主要介紹了Springboot 在普通類型注入Service或mapper,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
詳解Java Optional正確使用方式和優(yōu)勢(shì)(避免空指針異常)
作為一個(gè) Java 后端開發(fā)者,NullPointerException(空指針異常)幾乎是我們寫代碼時(shí)最常見、最難纏的 Bug 之一,下面我們就來聊聊如何正確使用Optional以避免空指針異常吧2025-07-07
Java 日期格式加上指定月數(shù)(一個(gè)期限)得到一個(gè)新日期的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java 日期格式加上指定月數(shù)(一個(gè)期限)得到一個(gè)新日期的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-05-05

