준준의 기록일지

[스프링부트 테스트 에러] java.lang.illegalStateException:unable to find a @SpringBootConfiguration, ..... 본문

스프링 에러

[스프링부트 테스트 에러] java.lang.illegalStateException:unable to find a @SpringBootConfiguration, .....

junjunwon 2020. 7. 28. 17:59

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."




출처 :https://parkcheolu.tistory.com/125 (박철우의 블로그) 임을 밝힙니다.

 

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

 

 

스프링 부트 테스트를 실행할 때 다음과 같은 에러를 만날 수 있다.

이 에러는 @SpringBootTest클래스가 실행되면서 필요한 스프링부트 설정 클래스를 찾지 못할 경우 발생한다.

흔히, 테스트 클래스를 작성하면서 테스트 클래스 패키지명을 메인 클래스 패키지와 차이가 생기면서 이 에러가 발생하는데, 해결 방법은 아래와 같다.

 

프로젝트 레이아웃이 아래와 같을때

---------------------------------------------------------------------------------------

 

src

    <- main

        <- com

            <-demo

                <-DemoApplication.java(@SpringBootApplication)

    <- test

        <- come

            <-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는 설정 클래스를 찾을 수 없다.

 

해결방법

    - 경로 똑같이 맞추기 (MyCustomTest클래스를 com.demo로 이동)

    - 경로 똑같이 맞추기 (com.demo.others에도 스프링부트 설정 패키지 생성)

    - 상위 경로에 설정 클래스 하나 두기(com 또는 com.demo에 에러 방지용 디폴트 설정 클래스 생성)

         <- 이건 무슨말인지 모르겠다.