??????在Spring Boot開發中,單元測試是保障代碼質量的核心環節。本文將基于實際開發場景,手把手教你如何快速實現分層測試、模擬依賴、編寫高效斷言,并分享最佳實踐!
一、5分鐘環境搭建
-
添加依賴
在pom.xml
中引入spring-boot-starter-test
,默認集成JUnit 5、Mockito、AssertJ等工具:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency>
-
測試類模板
測試類通常放在src/test/java
目錄,命名規范為被測試類名 + Test
。基礎模板如下:@SpringBootTest // 加載Spring上下文(適合集成測試) @ExtendWith(SpringExtension.class) // JUnit 5注解 class UserServiceTest {@Autowiredprivate UserService userService;// 測試方法... }
二、分層測試:精準覆蓋每一層
1. Service層測試:Mock依賴
場景:測試業務邏輯,隔離外部依賴(如數據庫、第三方接口)。
工具:@MockBean
模擬Spring管理的Bean。
@SpringBootTest
class UserServiceTest {@Autowiredprivate UserService userService;@MockBean // 模擬Repository依賴private UserRepository userRepository;@Testvoid testGetUserById() {// 1. 定義Mock行為when(userRepository.findById(1L)).thenReturn(Optional.of(new User("Alice")));// 2. 調用方法User user = userService.getUserById(1L);// 3. 斷言結果assertThat(user.getName()).isEqualTo("Alice");}
}
2. Controller層測試:MockMvc模擬HTTP請求
工具:@WebMvcTest
僅加載Web層組件,搭配MockMvc
模擬請求。
@WebMvcTest(UserController.class) // 僅初始化Web層
class UserControllerTest {@Autowiredprivate MockMvc mockMvc;@MockBeanprivate UserService userService;@Testvoid testGetUser() throws Exception {when(userService.getUserById(1L)).thenReturn(new User("Alice"));// 模擬GET請求并驗證響應mockMvc.perform(get("/users/1")).andExpect(status().isOk()).andExpect(jsonPath("$.name").value("Alice"));}
}
3. 持久層測試:真實數據庫操作
工具:@DataJpaTest
(JPA)或@DataMongoTest
(MongoDB)。
@DataJpaTest // 僅加載JPA組件,默認使用H2內存數據庫
class UserRepositoryTest {@Autowiredprivate UserRepository userRepository;@Testvoid testSaveUser() {User user = new User("Bob");User savedUser = userRepository.save(user);// 驗證ID自動生成assertThat(savedUser.getId()).isNotNull();}
}
三、測試進階技巧
1. 參數化測試:覆蓋多場景
使用@ParameterizedTest
快速測試多組輸入:
@ParameterizedTest
@ValueSource(ints = {1, 3, 5, -1}) // 測試奇數和邊界值
void testIsOdd(int number) {assertTrue(number % 2 != 0);
}
2. 測試生命周期控制
? @BeforeEach
:每個測試方法前執行(如初始化數據)。
? @AfterEach
:每個測試方法后執行(如清理數據庫)。
@BeforeEach
void setup() {userRepository.deleteAll();userRepository.save(new User("TestUser"));
}
3. 測試專用配置
通過@TestPropertySource
加載測試配置文件:
@SpringBootTest
@TestPropertySource(locations = "classpath:test.properties")
class MyTest {// 使用test.properties中的配置
}
四、最佳實踐與避坑指南
-
分層策略
? 單元測試:聚焦單一類,用@MockBean
隔離外部依賴。? 集成測試:使用
@SpringBootTest
驗證組件交互。? Web層測試:優先用
@WebMvcTest
而非啟動完整應用。 -
斷言工具選擇
? AssertJ(推薦):鏈式斷言更直觀。assertThat(userList).hasSize(3).extracting("name").contains("Alice", "Bob");
-
環境隔離
? 使用H2內存數據庫替代生產庫。? 用
@MockBean
模擬外部服務(如支付接口)。 -
測試數據管理
? @Sql注解:運行前執行SQL腳本初始化數據。@Test @Sql("/init-user-data.sql") void testUserCount() {assertThat(userRepository.count()).isEqualTo(5); }
五、快速運行測試
? IDE操作:右鍵測試類 → Run as JUnit Test
。
? 命令行運行:
mvn test # Maven
./gradlew test # Gradle
總結
??????單元測試不是負擔,而是高效開發的基石。通過分層測試、精準Mock和高效斷言,可以大幅提升代碼可靠性。立即動手,為你的Spring Boot項目加上“安全鎖”吧!
新時代農民工