hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
      • Spring Boot
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Machine Learning
    • Git và Github
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
  • Lập trình Python
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Spring Boot
Spring Boot bài 26: Integration test MVC, API, database và Security
Java và Spring Boot – MVC và REST API

Spring Boot bài 26: Integration test MVC, API, database và Security

  • 18-10-2026
  • Toanngo92
  • 0 Comments

Giáo trình Spring Boot MVC và REST API · Chương 11/12: Kiểm thử Service, MVC và API · Bài 26/28 · Biên soạn tháng 10/2026.

← Bài 25 · Mục lục 12 chương · Bài 27 →

Mục lục

  • Mục tiêu bài học
  • Khác với unit test
  • Kiểm tra cả trường hợp bị từ chối
  • API cần kiểm tra hợp đồng HTTP
  • H2 và MySQL cần hai mức bằng chứng
  • Lỗi thường gặp và lưu ý
  • Ghi nhớ
  • Tài liệu đối chiếu

Mục tiêu bài học

Kiểm tra các thành phần cùng hoạt động bằng MockMvc, bao gồm render template, validation, quyền và CRUD API.

Khác với unit test

@SpringBootTest tạo application context thực của mẫu; @AutoConfigureMockMvc cung cấp MockMvc để gửi request qua hạ tầng MVC và filter mà không mở cổng mạng thật. Với Boot 4, annotation MockMvc thuộc package org.springframework.boot.webmvc.test.autoconfigure; mã nguồn mẫu đã dùng đúng import.

Cấu hình trong src/test/resources dùng H2 riêng, tắt email và scheduling, có mật khẩu chỉ dành cho test. Flyway tạo schema rồi Hibernate validate. Điều đó kiểm tra nhiều mắt xích mà mock repository không thể thấy: mapping entity, tên bảng, template, JSON và SecurityFilterChain.

Tệp trong mã nguồn mẫu: src/test/java/com/hocvietcode/academy/WebIntegrationTest.java. Đoạn dưới được trích từ tệp này; xem bản tải về để có đủ import và phần còn lại.

@SpringBootTest @AutoConfigureMockMvc @Transactional
class WebIntegrationTest {
    @Autowired MockMvc mvc; @Autowired CourseRepository repository;
    @Test void publicListRendersEscapedHtmlAndPagination()throws Exception{
        mvc.perform(get("/courses").param("size","1")).andExpect(status().isOk()).andExpect(view().name("courses/list"))
          .andExpect(content().string(org.hamcrest.Matchers.containsString("page=1")));
    }
    @Test void detailRenders()throws Exception{mvc.perform(get("/courses/1")).andExpect(status().isOk());}
    @Test void formContainsCsrfToken()throws Exception{
        mvc.perform(get("/admin/courses/new").with(user("teacher").roles("TEACHER")))
          .andExpect(status().isOk()).andExpect(content().string(org.hamcrest.Matchers.containsString("name=\"_csrf\"")));
    }

Kiểm tra cả trường hợp bị từ chối

Teacher tạo thành công chưa đủ. Cần student có CSRF nhưng vẫn bị 403, teacher thiếu CSRF bị 403, form sai không tăng số bản ghi, tài nguyên thiếu trả 404 và form render có input _csrf. Kiểm tra HTML thật giúp bắt lỗi template mà chỉ assert tên view có thể bỏ sót.

Các test .with(user(…)) giả lập authentication để tập trung vào authorization. Nó không kiểm tra mật khẩu thật. Vì vậy bộ mẫu có thêm loginWorksWithConfiguredPassword gửi POST /login với CSRF và password test để kiểm tra luồng xác thực thực tế.

Tệp trong mã nguồn mẫu: src/test/java/com/hocvietcode/academy/WebIntegrationTest.java. Đoạn dưới được trích từ tệp này; xem bản tải về để có đủ import và phần còn lại.

@Test void invalidFormKeepsErrorsAndDoesNotSave()throws Exception{
    long count=repository.count();
    mvc.perform(post("/admin/courses").with(user("teacher").roles("TEACHER")).with(csrf())
        .param("title","").param("price","-1").param("categoryId","1"))
        .andExpect(status().isOk()).andExpect(model().attributeHasFieldErrors("form","title","price"));
    assertThat(repository.count()).isEqualTo(count);
}

API cần kiểm tra hợp đồng HTTP

ApiIntegrationTest xác nhận envelope danh sách, ProblemDetail 404, validation 400, token không cache, CORS origin hợp lệ và origin lạ. crudRoundTrip tạo, sửa, xóa rồi đọc lại để kiểm tra toàn luồng. Test không chỉ nhìn JSON có một title mà còn xác nhận status và Location.

@Transactional trên test giúp rollback thay đổi DB khi chạy cùng luồng MockMvc này. Nếu chuyển sang webEnvironment=RANDOM_PORT và HTTP thật, server chạy ở luồng/giao dịch khác; rollback test không tự xóa mọi thay đổi của server. Khi đó cần chiến lược dọn dữ liệu hoặc DB dùng một lần.

H2 và MySQL cần hai mức bằng chứng

H2 nhanh và thuận tiện nhưng MODE=MySQL không mô phỏng đầy đủ MySQL. Trước triển khai, chạy migration và smoke test trên MySQL đúng phiên bản hoặc dùng Testcontainers trong pipeline phù hợp. Không chạy test xóa dữ liệu trên database đang phục vụ học viên.

Mail và HTTP ngoài được mock trong test chuyên biệt để tránh gửi thư hoặc phụ thuộc mạng. Upload có test tệp hợp lệ, quá dung lượng, sai loại và đường dẫn không hợp lệ. Một bộ test có giới hạn được mô tả rõ sẽ hữu ích hơn lời khẳng định “đã test tất cả” mà không biết đang dùng database và môi trường nào.

.\mvnw.cmd test
# Báo cáo XML/text: target/surefire-reports/
# Chạy riêng nhóm API khi cần chẩn đoán:
.\mvnw.cmd -Dtest=ApiIntegrationTest test

Lỗi thường gặp và lưu ý

  • Không tắt filter trong MockMvc rồi dùng kết quả đó để kết luận phân quyền đã đúng.
  • Transactional test rollback không tự bao phủ request chạy ở luồng của web server thật.

Ghi nhớ

Integration test xác nhận đường nối giữa các thành phần, gồm cả nhánh lỗi và quyền, với giới hạn môi trường được nêu rõ.

Tài liệu đối chiếu

  • Testing Spring Boot Applications
  • MockMvc

← Bài 25 · Mục lục 12 chương · Bài 27 →

Bài viết liên quan:

Java và Spring Boot – MVC và REST API
Spring Boot bài 18: Phân quyền teacher/student và bảo vệ endpoint
Java và Spring Boot – MVC và REST API
Spring Boot bài 19: CSRF, CORS và gọi API có session đúng cách
Java và Spring Boot – MVC và REST API
Spring Boot bài 20: REST Controller, JSON và DTO cho API danh sách
Java và Spring Boot – MVC và REST API
Spring Boot bài 21: REST CRUD: POST, PUT, DELETE và mã trạng thái
Java và Spring Boot – MVC và REST API
Spring Boot bài 22: Validation API, ProblemDetail và hợp đồng lỗi
Java và Spring Boot – MVC và REST API
Spring Boot bài 23: Gọi dịch vụ HTTP bằng RestClient và đặt timeout
Java và Spring Boot – MVC và REST API
Spring Boot bài 08: Fragment, layout và tài nguyên CSS trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 24: Gửi email và lập lịch tác vụ trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 09: Binding biểu mẫu tạo và sửa khóa học
Java và Spring Boot – MVC và REST API
Spring Boot bài 25: Unit test Service với JUnit và Mockito
Java và Spring Boot – MVC và REST API
Spring Boot bài 10: Validation và BindingResult: báo lỗi ngay trên biểu mẫu
Java và Spring Boot – MVC và REST API
Spring Boot bài 27: Logging, Actuator và quản lý schema bằng Flyway

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

Giáo trình Python: mục lục 12 chương, 24 bài từ cơ bản đến ứng dụng

Python bài 24: Lock, Queue và thiết kế worker an toàn

Python bài 23: Thread, start, join và concurrency

Python bài 22: Kết nối MySQL và CRUD có transaction

Python bài 21: Gọi HTTP API, xử lý JSON và tải dữ liệu

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×