Written by: Phạm Minh Khải
Gmail: mkpham2000@gmail.com
Bài viết gốc: https://www.baeldung.com/spring-boot-unable-to-find-springbootconfiguration-with-datajpatest

1. Giới thiệu

Trong bài viết này, chúng ta sẽ xem cách giải quyết lỗi Không thể tìm thấy @SpringBootConfiguration.

2. Nguyên nhân

@DataJpaTest annotation giúp chúng ta thiết lập kiểm tra JPA. Đối với điều này, nó khởi tạo ứng dụng, bỏ qua các phần không liên quan. Ví dụ, nó bỏ qua bộ điều khiển MVC.

Tuy nhiên, để khởi tạo ứng dụng nó cần cấu hình, nó tìm kiếm trong gói hiện tại và đi lên trong phân cấp gói cho đến khi tìm thấy cấu hình.

Ví dụ: Thêm @DataJpaTest trong gói com.baeldung.data.jpa. Sau đó, nó sẽ tìm kiếm một lớp cấu hình trong:

  • com.baeldung.data.jpa
  • com.baeldung.data
  • và cứ tiếp tục như thế

Tuy nhiên, khi không tìm thấy cấu hình, ứng dụng sẽ báo lỗi:

Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...)
  with your test java.lang.IllegalStateException

Điều này có thể xảy ra vì lớp cấu hình nằm trong một gói cụ thể hơn, như com.baeldung.data.jpa.application.

Hãy chuyển lớp cấu hình đến com.baeldung.data.jpa. Kết quả là Spring sẽ có thể tìm thấy nó.

Mặt khác, chúng ta có thể có một mô-đun(nodule) không có bất kỳ @SpringBootConfiguration nào. Trong phần tiếp theo, chúng ta sẽ xem xét kịch bản này.

3. Thiếu @SpringBootConfiguration

Điều gì sẽ xảy ra nếu module của chúng ta không chứa bất kỳ @SpringBootConfiguration nào? Có thể có nhiều lý do cho điều đó. Giả sử, chúng ta có một module chỉ chứa các lớp mô hình.

Vì vậy, giải pháp là thêm @SpringBootApplication vào test code

@SpringBootApplication
public class TestApplication {}

Bây giờ chúng ta có một lớp được chú thích, Spring có thể khởi động các bài kiểm tra của chúng ta.

Để xác thực thiết lập ấy, hãy đưa TestEntityManager vào và xác thực rằng nó đã được thiết lập:

@RunWith(SpringRunner.class)
@DataJpaTest
public class DataJpaUnitTest {

    @Autowired
    TestEntityManager entityManager;

    @Test
    public void givenACorrectSetup_thenAnEntityManagerWillBeAvailable() {
        assertNotNull(entityManager);
    }
}

Thử nghiệm này thành công khi Spring có thể tìm thấy @SpringBootConfiguration trong gói của chính nó hoặc một trong các parent packages của nó.

4. Kết luận

Trong bài viết ngắn này, chúng ta đã xem xét hai nguyên nhân khác nhau gây ra lỗi: “Không thể tìm thấy @SpringBootConfiguration”.

Đầu tiên, chúng ta đã xem xét một trường hợp không thể tìm thấy lớp cấu hình. Điều này là do vị trí của nó. Chúng ta giải quyết nó bằng cách di chuyển lớp cấu hình đến một vị trí khác.

Thứ hai, chúng ta đã xem xét một kịch bản mà không có lớp cấu hình nào khả dụng. Chúng ta giải quyết vấn đề này bằng cách thêm @SpringBootApplication vào cơ sở mã thử nghiệm