스프링부트 테스트를 실행할 때 다음과 같은 에러를 만날 수 있다.
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
이 에러는 @SpringBootTest 클래스가 실행되면서 필요한 스프링부트 설정 클래스를 찾지 못할 경우 발생한다.
흔히, 테스트 클래스를 작성하면서 테스트 클래스 패키지명을 메인 클래스 패키지와 차이가 생기면서 이 에러를 만나는데, 해결 방법은 간단하다.
프로젝트 레이아웃이 아래와 같다고 하자:
src
+--main
+--com
+--demo
+--demo
+--DemoApplication.java (@SpringBootApplication)
+--test
+--com
+--demo
+--demo
+--DemoApplicationTest.java (@SpringBootTest)
+--demo
+--others
+--MyCustomTest.java (@SpringBootTest)
DemoApplicationTest 는 정상 실행 될 것이다. MyCusTomTest 는 위의 에러를 만날 것이다. MyCustomTest 가 찾을 수 있는 스프링부트 설정 클래스가 없기 때문이다.
스프링부트 실행 클래스는 자신의 패키지에서부터 스프링부트 설정 클래스를 찾기 시작하여, 찾을 때 까지 상위 패키지로 계속 찾아나간다.
위의 경우, MyCustomTest 클래스가 실행되면서 스프링부트 설정 클래스를 찾는 순서는 다음과 같다:
1. com.demo.others
2. com.demo
3. com
그런데 위 프로젝트에서 유일한 스프링부트 설정 클래스인 DemoApplication 은 MyCustomTest 의 상위 패키지가 아닌, 같은 레벨의 다른 이름을 가진 패키지에 존재하고, 이 경우 MyCustomTest 는 설정 클래스를 찾을 수 없다.
해결 방법은 다음과 같다.
1. 경로 똑같이 맞추기1 (MyCustomTest 클래스를 com.demo.demo 로 이동)
2. 경로 똑같이 맞추기2 (com.demo.others 에도 스프링부트 설정 패키지 생성)
3. 상위 경로에 설정 클래스 하나 두기 (com 또는 com.demo 에 에러 방지용 디폴트 설정 클래스 생성)
어쨌든 테스트 실행 클래스가 찾을 수 있는 설정 파일이 있기만 하면 된다.
'Java > Spring Boot' 카테고리의 다른 글
스프링 어플리케이션(+컨텍스트) 이벤트 (0) | 2022.08.08 |
---|---|
test] 어노테이션 정리 (1) | 2022.08.03 |
MVC] Serving Static Resources (0) | 2020.08.15 |
JDK 7 에서 Spring JUnit 5 을 사용한 Gradle test (0) | 2020.04.14 |
Issue with Thymeleaf strict HTML parsing (0) | 2020.04.07 |