SpringBoot中@Test的介紹和使用案例
SpringBoot Test介紹
SpringBoot提供了方便的測試功能,可以很容易地進行單元測試和集成測試。主要包含以下幾點:
- Spring Boot提供了@SpringBootTest注解,可以用來啟動Spring Boot應用,進行集成測試。
- Spring Boot提供了@MockBean注解,可以用來 Mock Bean。
- Spring Boot提供了@SpyBean注解,可以用來 Spy Bean。
- Spring Boot提供了@SpringBootConfiguration注解,可以用來聲明配置類。
- Spring Boot提供了AssertJ的支持,可以用來進行斷言。
- Spring Boot提供了測試相關的工具類,如TestRestTemplate等。
- SpringBoot提供了@LocalServerPort可以非常方便的模擬客戶端,對運行的服務進行端到端集成測試
- SpringBoot提供了自動配置MockMvc,方便在測試類中直接注入并使用MockMvc
依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
常用注解
@SpringBootTest
這個注解用來進行集成測試,會啟動整個Spring Boot應用,進行端到端測試。
用法:
@SpringBootTest public class MyTest { // 測試方法 }
可以通過webEnvironment參數來指定測試環(huán)境:
- MOCK:加載Web Application Context,不啟動Servlet容器。
- RANDOM_PORT:加載Servlet容器,使用隨機端口。
- DEFINED_PORT:加載Servlet容器,使用定義好的端口。
- NONE:加載Web Application Context,但是不啟動Servlet容器。
@WebMvcTest
這個注解用來測試Web層,會自動注入Web層的Bean,不會啟動整個Spring Boot應用。
用法:
@WebMvcTest(UserController.class) public class MyTest { @Autowired private MockMvc mvc; // 測試方法 }
@DataJpaTest
這個注解用來測試JPA相關的Bean,會自動配置Spring Data JPA相關的Bean。
用法:
code@DataJpaTest public class MyTest { @Autowired private TestEntityManager entityManager; @Autowired private UserRepository userRepository; // 測試方法 }
@MockBean
這個注解用來Mock一個Bean,注入測試類中,用來Isolation測試。
用法:
@SpringBootTest public class MyTest { @MockBean private UserService userService; // 測試方法 }
@SpyBean
這個注解用來Spy一個Bean,注入測試類中,不影響真正的Bean。
用法:
@SpringBootTest public class MyTest { @MockBean private UserService userService; // 測試方法 }
@SpringBootConfiguration
這個注解用來聲明配置類,相當于@Configuration。
用法:
@SpringBootConfiguration public class MyConfig { // 配置代碼 }
可以用在測試類中加載額外的配置類。
@LocalServerPort
這個是一個非常有用的注解,它可以為測試獲取啟動的嵌入式服務器實例的實際端口號。
主要作用和用法如下:
自動注入啟動的服務器端口號
在測試類中,可以像下面這樣使用@LocalServerPort注解:
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class MyTest { @LocalServerPort private int port; // 測試方法可以使用port變量 }
這樣就可以拿到隨機分配的端口號。
結合@Value使用
@LocalServerPort也可以和@Value結合使用:
@Value("${local.server.port}") private int port;
測試端點
有了端口號,可以通過測試端點進行驗證:
@Autowired private TestRestTemplate restTemplate; @Test public void test() { String body = this.restTemplate.getForObject("http://localhost:" + port + "/hello", String.class); assertEquals("Hello World", body); }
模擬客戶端
使用@LocalServerPort可以非常方便的模擬客戶端,對運行的服務進行端到端集成測試。
@AutoConfigureMockMvc
這個是Spring Boot提供的一個便捷的注解,可以用來自動配置MockMvc,方便在測試類中直接注入并使用MockMvc。
主要作用如下:
自動注入MockMvc
在測試類中,可以直接注入MockMvc:
@Autowired private MockMvc mvc;
不需要自己配置MockMvc。
結合@WebMvcTest使用
@AutoConfigureMockMvc經常和@WebMvcTest一起使用,對控制器進行單元測試:
@WebMvcTest @AutoConfigureMockMvc public class TestController { @Autowired private MockMvc mvc; @MockBean private UserService userService; @Test public void test() throws Exception { // 使用MockMvc進行請求測試 } }
模擬HTTP請求
有了MockMvc,可以輕松模擬各種HTTP請求來測試控制器:
// GET mvc.perform(get("/users")) .andExpect(status().isOk()); // POST mvc.perform(post("/users")) .andExpect(status().isCreated()); // 模擬參數 mvc.perform(get("/users").param("name", "test")) .andExpect(content().string(containsString("test")));
驗證響應
可以通過MockMvc對響應結果進行驗證:
mvc.perform(get("/users/1")) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.name").value("Test User"));
總之,@AutoConfigureMockMvc可以靈活地模擬HTTP請求,并驗證響應,使得測試Web層變得非常方便。它通常與@WebMvcTest注解配合使用,為 Spring Boot的測試提供了很大的便利。
到此這篇關于SpringBoot中@Test的介紹和使用的文章就介紹到這了,更多相關SpringBoot @Test使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Apache?Hudi異步Clustering部署操作的掌握
這篇文章主要介紹了Apache?Hudi異步Clustering部署操作的掌握,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-03-03如何在java 8 stream表達式實現(xiàn)if/else邏輯
這篇文章主要介紹了如何在java 8 stream表達式實現(xiàn)if/else邏輯,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04SpringBoot集成redis實現(xiàn)分布式鎖的示例代碼
這篇文章主要介紹了SpringBoot集成redis實現(xiàn)分布式鎖的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01