2장 테스트에서 만난 에러들

아래 테스트를 진행하려는데 이런 에러들이 났다..

@ExtendWith(SpringExtension.class)
@WebMvcTest
public class HelloControllerTest {
    @Autowired
    private MockMvc mvc;

    @Test
  	public void helloDto_리턴된다() throws Exception {
    
    }
}

1-1) 첫번째 에러

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

1-2) 해결법

이 에러는 디렉토리가 구조가 맞지않아 생기는 에러이다.

  1. 테스트 하려는 컨트롤러와 같은 패키지에 테스트 클래스를 위치하면 해결된다.

그런데 나는 같은 위치였어도 계속해서 같은 에러가 났다.
또 다른 해결법은 에러 로그가 하라는대로 하면된다.

  1. @SpringBootTest(classes=...) 로 컨트롤러 클래스 이름을 명시해주면 된다.
    [예시] @SpringBootTest(classes = HelloController.class)

2번 방법으로 @SpringBootTest(classes = HelloController.class)을 명시해주었다...
앞선 포스팅을 참조하면 알겠지만, @SpringBootTest 을 사용하면 @ExtendWith(SpringExtension.class)/
@WebMvcTest 와 중첩되기때문에 모두 지워진다.
따라서 선언한 MockMvc 에서 다음과 에러가 발생한다.


2-1) 두번째 에러

Could not autowire. No beans of 'MockMvc' type found.

2-2) 해결법

@SpringBootTest에서 MockMvc 를 사용하기 위해서는 @AutoConfigureMockMvc 사용해주어야 한다.

  • @AutoConfigureMockMvc는 @WebMvcTest와 비슷하게 사용할 수 있는 어노테이션이다.

  • @SpringBootTest에는 웹 애플리케이션 테스트를 지원하는 webEnvironment 속성이 있다. 이 속성을 생략하면 기본값으로 WebEnvironment.MOCK이 설정되어 있는데, 이 설정에 의해서 서블릿 컨테이너가 모킹된다.

  • @SpringBootTest(webEnvironment=WebEnvironment.MOCK) 설정으로 모킹한 객체를 의존성 주입받으려면 @AutoCOnfigureMockMvc를 클래스 위에 추가 해야한다.


하지만 여기까지 와도 어째서인지 추가적인 에러가 발생했다. . .


3-1) 세번째 에러

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
. . .
java.lang.AssertionError: Status expected:<200> but was: <406>

3-2) 해결법

@EnableWebMvc

스프링이 자동으로 제공하는 웹과 관련된 최신 전략 빈들을 설정해주는 어노테이션이다. 테스트 하고자하는 컨트롤러(HelloController) 에 적어주니까 정상적으로 동작했다!

추가로 이 에러는 @Getter 가 없을때 자주 발생한다고 한다. 혹시라도 나의 해결법이 도움이 되지 않았다면 참고해도 좋을 것 같다.


최종 해결법 : 디렉토리 이름에 오타 수정하기

하지만 여기까지 와도 왠지 찝찝했다.. 자동화는 좋지만 원리를 모르고 지나치는 느낌이었다.
그래서 다시 한번 코드를 둘러봤고, 본질적인 문제를 해결할 수 있었다..

이유는 바보같게도 Controller 가 위치한 패키지에 오타가 있었다....
이틀동안 못 보고 돌고 돌아 여러 방법을 만났지만 오타를 수정하면 되는 간단한(?) 문제였다.
혹시 이런 문제를 만났다면 잠시 눈을 쉬게하고 오타를 먼저 찾는 전략도 좋을 것 같다.
정말 테스트 코드 에러 고치는게 제일 힘든 일 같다...

마무리

결론적으로 아래 코드는 MVC 테스트를 진행하는데 문제가 없다.
혹시 이 코드에서 문제가 발생한다면 다른 부분에 문제가 있을 확률이 높다는 것을 알아주었으면 한다.

@ExtendWith(SpringExtension.class)
@WebMvcTest
public class HelloControllerTest {
    @Autowired
    private MockMvc mvc;

    @Test
  	public void helloDto_리턴된다() throws Exception {
    
    }
}

출처 및 인용

[SpringBoot] Test(2) MockMvc를 이용해서 테스트하기(@WebMvcTest, @AutoConfigureMockMvc)
[Spring] 설정 자동화와 설정의 변경, @EnableWebMvc와 WebMvcConfigurer

0개의 댓글