1.3.3 Kiểm thử controller
Việc kiểm thử các ứng dụng web có thể khá phức tạp khi cần đưa ra các kiểm tra (assertion) với nội dung của một trang HTML. Rất may là Spring đi kèm với một hệ thống hỗ trợ kiểm thử mạnh mẽ, giúp việc kiểm thử ứng dụng web trở nên dễ dàng hơn.
Đối với trang chủ, bạn sẽ viết một bài kiểm thử có độ phức tạp tương đương với chính trang chủ đó. Bài kiểm thử sẽ thực hiện một yêu cầu HTTP GET tới đường dẫn gốc / và kỳ vọng kết quả trả về thành công với tên view là home và nội dung kết quả chứa cụm từ “Welcome to….” Đoạn mã sau sẽ làm được điều đó.
Liệt kê 1.6 Kiểm thử controller của trang chủ
package tacos;
import static org.hamcrest.Matchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
@WebMvcTest(HomeController.class)
public class HomeControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testHomePage() throws Exception {
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(view().name("home"))
.andExpect(content().string(
containsString("Welcome to...")));
}
}Điều đầu tiên bạn có thể nhận thấy về bài kiểm thử này là nó có chút khác biệt so với lớp TacoCloudApplicationTests ở phần chú thích (annotation) được áp dụng. Thay vì sử dụng @SpringBootTest, lớp HomeControllerTest được chú thích với @WebMvcTest. Đây là một annotation đặc biệt do Spring Boot cung cấp, giúp thiết lập môi trường để kiểm thử trong ngữ cảnh của một ứng dụng Spring MVC. Cụ thể hơn, trong trường hợp này, nó sẽ đăng ký HomeController vào trong Spring MVC để bạn có thể gửi yêu cầu tới controller đó.
@WebMvcTest cũng thiết lập các hỗ trợ cần thiết của Spring để kiểm thử Spring MVC. Mặc dù nó có thể được cấu hình để khởi chạy một máy chủ thật, nhưng việc mô phỏng (mock) các thành phần của Spring MVC là đủ cho mục đích của bạn. Lớp kiểm thử sẽ được tiêm vào một đối tượng MockMvc để thực hiện các thao tác kiểm thử.
Phương thức testHomePage() định nghĩa bài kiểm thử mà bạn muốn thực hiện với trang chủ. Nó bắt đầu bằng cách sử dụng đối tượng MockMvc để thực hiện một yêu cầu HTTP GET đến / (đường dẫn gốc). Từ yêu cầu đó, bài kiểm thử đặt ra các kỳ vọng sau:
- Phản hồi phải có mã trạng thái HTTP 200 (OK).
- View được trả về phải có tên logic là
home. - View được render phải chứa văn bản “Welcome to….”
Bạn có thể chạy bài kiểm thử trong IDE yêu thích hoặc bằng Maven như sau:
mvnw testNếu sau khi đối tượng MockMvc thực hiện yêu cầu mà bất kỳ kỳ vọng nào phía trên không được đáp ứng, thì bài kiểm thử sẽ thất bại. Nhưng vì controller và template hiển thị của bạn đã được viết để đáp ứng những kỳ vọng đó, nên bài kiểm thử sẽ vượt qua một cách suôn sẻ — ít nhất là với màu xanh lục báo hiệu rằng bài test đã thành công.
Controller đã được viết, template hiển thị đã được tạo, và bài test đã vượt qua. Có vẻ như bạn đã triển khai thành công trang chủ. Nhưng mặc dù bài test đã thành công, sẽ có gì đó thỏa mãn hơn khi bạn thấy kết quả trực tiếp trong trình duyệt. Dù sao thì khách hàng của Taco Cloud cũng sẽ thấy nó theo cách đó. Hãy build ứng dụng và chạy nó thôi.
