error handling

[errorHandling] (Junit) spring testing관련, Unable to find a @SpringBootConfiguration... 발생

기록하는 습관. 2023. 1. 15. 15:03

안녕하세요. Java백엔드 개발자를 꿈꾸며 공부중인 김은철입니다.

해당 포스팅의 내용은 이해한 내용을 토대로 작성되었습니다.

그렇기 때문에 포스팅에 잘못된 내용이 포함되어 있을 수 있음과 미흡한 점이 있을 수 있습니다.


의아한 내용이나 틀린 내용이 있다면 적극적인 지적과 므흡한 내용, 그리고 추가적으로 학습하며 좋을 내용을 알려주시면 감사하겠습니다.


여러분의 지적과 관심은 저의 성장에 큰 도움이 될 것이라 확신합니다.


감사합니다.



안녕하세요. 이번 포스팅에서는 API계층 슬라이스 테스트를 진행하며 마주했던 문제와 문제를 해결하기 위해 찾았던 자료들중, 읽어보면 좋을법한 자료에 대해서 소개해보겠습니다.


1. API 계층 테스트를 진행하며 마주했던 문제

[1] Unable to find a @SpringBootConfiguration... 발생

package com.controller; // [1]

// ... 이하 코드생략
// ... 이하 코드생략 
@SpringBootTest // [2]
@AutoConfigureMockMvc // [3]
class MemberControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private Gson gson; 

    @Test
    void postMemberTest() throws Exception {
        // given
        MemberDto.Post post = MemberDto.Post.builder()
                .email("hgd@gmail.com")
                .name("홍길동")
                .phone("010-1234-5678")
                .build();

        String content = gson.toJson(post);

        ResultActions actions =


// ... 이하 코드생략
// ... 이하 코드생략 
    }
}
Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test java.lang.IllegalStateException

위의 코드는 문제가 되었던 일부를 발췌해왔습니다. 테스트를 실행하고 저는 최소한으로 애플리케이션이 실행되는 것을 기대했는데 위의 로그와 에러가 발생하였습니다. 로그를 보면 @SpringBootTest를 사용하라고 이야기하고 있는데, 코드 2번의 주석처럼 명시를 하였고 테스트를 위한 Application Context를 구성했습니다. 해답은 준수한쭈니네님의 포스팅에서 찾을 수 있었습니다.


* 해결방안

기능이 구현된 패키지를 살펴 보았을 때 @SpringBootApplication이 붙어있는 클래스의 패키지 구조는 com.euncheol.자바파일이었습니다. 문제가 되었던 코드의 패키지는 controller.MemberControllerTest.java인데 테스트 패키지 구조에서 MemberControllerTest 클래스 파일을 com.euncheol의 하위로 바꾸어주니 문제를 해결할 수 있었습니다. 해결된 코드는 아래와 같습니다.

package com.euncheol.controller; // [1]

// ... 이하 코드생략
// ... 이하 코드생략 
@SpringBootTest // [2]
@AutoConfigureMockMvc // [3]
class MemberControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private Gson gson; 

    @Test
    void postMemberTest() throws Exception {
        // given
        MemberDto.Post post = MemberDto.Post.builder()
                .email("hgd@gmail.com")
                .name("홍길동")
                .phone("010-1234-5678")
                .build();

        String content = gson.toJson(post);

        ResultActions actions =


// ... 이하 코드생략
// ... 이하 코드생략 
    }
}

* 발생했던 다른 문제

어제 새벽에 문제가 발생하고 다음날의 오후에 포스팅을 진행하는 것인데... 역직렬화를 돕는 Gson에서 NPE문제가 발생했었습니다. 왜 발생했었는지 코드에 작성했었는데... 어떤 이유여서인지 NPE문제가 발생되지 않았지만 이 또한 패키지를 맞춰주니 해결했었습니다. 그리고 Gson과 관련한 내용이 있었는데 궁금하시면 아래 글을 참고해주세요.

1. Gson초기화 추천 방법

참고자료 : Stack Overflow 질문 내용

해당 글에 의하면 Gson을 주입으로 사용하는 것보단, 새로운 객체를 만들어 사용하길 권장하는듯 합니다. 권장 방식은 아래와 같습니다.

@Autowired
private Gson gson; 

// 권장 방식 : private Gson gson = new GsonBuilder().create();

* 마무리하며

어려웠던 문제는 아니었습니다 :)