unit-test-controller-layer 是做什麼的?
提供使用 MockMvc 和 @WebMvcTest 進行 REST 控制器單元測試的模式。生成可驗證請求/回應映射、驗證、例外處理和 HTTP 狀態碼的控制器測試。適用於隔離測試 Web 層端點,用於 API 端點測試、Spring MVC 測試、模擬 HTTP 請求或控制器層單元測試。
概述
此技能透過建立完整的單元測試,協助開發人員測試 Spring MVC REST 控制器。它專注於使用 MockMvc 和 @WebMvcTest 註解來隔離 Web 層,確保只測試控制器邏輯,而不涉及服務層或資料層。
主要功能
- 自動生成測試類別:根據控制器類別自動建立對應的測試檔案。
- 端點測試:為每個 REST 端點(GET、POST、PUT、DELETE)生成測試方法。
- 請求驗證:測試輸入驗證(例如
@Valid和自訂驗證器)是否正確觸發。 - 例外處理:驗證控制器是否正確處理例外並傳回適當的 HTTP 狀態碼。
- 回應驗證:檢查回應狀態碼、標頭和回應主體。
使用方式
要求
- Spring Boot 2.x 或 3.x
- JUnit 5 (Jupiter)
- MockMvc (透過
@WebMvcTest自動配置)
範例
假設您有以下控制器:
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
// 實作
}
@PostMapping
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
// 實作
}
}
此技能將生成以下測試:
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
void shouldReturnUserWhenGetUserById() throws Exception {
// 安排
Long userId = 1L;
User user = new User("John", "[email protected]");
when(userService.getUserById(userId)).thenReturn(user);
// 執行並斷言
mockMvc.perform(get("/api/users/{id}", userId))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("John"));
}
@Test
void shouldReturnBadRequestWhenInvalidUser() throws Exception {
// 安排
User invalidUser = new User("", "invalid-email");
// 執行並斷言
mockMvc.perform(post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content(asJsonString(invalidUser)))
.andExpect(status().isBadRequest());
}
}
平台支援
- IDE:IntelliJ IDEA、Eclipse、VS Code
- 建置工具:Maven、Gradle
- 框架:Spring Boot、Spring MVC
- 測試框架:JUnit 5、Mockito
結論
使用此技能可以大幅簡化 REST 控制器的單元測試編寫流程,提升測試覆蓋率,確保 API 端點的可靠性。它適合任何使用 Spring MVC 的專案,特別是需要快速建立測試的開發團隊。
此技能文件由 giuseppe-trisciuoglio/unit-test-controller-layer 提供。