티스토리 뷰

Spring

[Test] Spring AutoConfigure Annotation Test

CharlieZip 2023. 5. 29. 21:20
반응형

테스트 공부를 위한 3번째 글인데요.

이번에는 Spring에서 테스트를 좀 더 쉽게 하도록 지원해주는 어노테이션의 종류를 알아보고 각각의 특성을 간략하게 살펴보겠습니다.

어노테이션에 대한 자세한 사용법이 아닌 종류와 특성을 살펴보고 추후에 테스트를 작성시 필요한 어노테이션을 적절하게 사용하기 위한 정리라고 생각해주시면 좋을거 같습니다

 

테스트 코드 공부 시리즈

1. AssertJ를 이용한 테스트 코드 작성

2. JUnit의 Parameterized 어노테이션 사용하기

3. Spring AutoConfigure Annotation Test

4. Mockito 톺아보기 w.kotlin

5. kotlin에 특화된 mockito-kotlin 사용하기

6. postman을 이용한 시나리오 테스트 하기

 

 

@SpringBootTest


가장 대표적인 테스트 어노테이션으로 스프링이 관리하는 모든 빈을 등록시켜서 테스트 환경을 제공한다.

주로 단위 테스트보다는 통합테스트를 할때 사용합니다.

  • @SpringBootTest(webEnvironment=WebEnvironment.MOCK) : 디폴트 설정
    • 기본 설정으로 서블릿 컨테이너가 모킹됨

단, @SpringBootTest 어노테이션은 MockMvc 를 빈으로 등록하지 않기 때문에 MockMvc를 사용하기 위해서는 @AutoConfigureMockMvc를 같이 사용해 주어야 합니다.

 

 

@WebMvcTest


Spring MVC의 컨트롤러를 테스트하는데 사용합니다.

  • @Controller, @ControllerAdvice, @JsonComponent 와 Filter, WebMvcConfigurer, HandlerMethodArgumentResolver 등 MVC 관련 설정들만 로드되기 때문에, 실제 구동되는 어플리케이션과 똑같이 컨텍스트를 로드하는 @SpringBootTest 어노테이션보다 가볍게 테스트가 가능
  • @WebMvcTest 사용시 MockMvc도 빈으로 자동 등록해준다.
  • @WebMvcTest 는 SpringSecurity 도 함께 등록된다. @Autowired 로 MockMvc 를 주입받으면 WebApplicationContext 와 Security 설정까지 붙은 MockMvc 가 주입된다.
    • SecurityConfiguration 은 올라가지만, SecurityConfiguration 안에서 주입받던 빈들은 올라가지 않기 때문에 @MockBean 으로 등록하여 필요한 동작과정을 정의해줘야한다.
    • Security 등록을 원치 않는다면 excludeFilters 속성을 통해@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, classes=SecurityConfiguration::class) 제외할 수 있다.

 

 

🤔 SpringBootTest vs WebMvcTest

@AutoConfigureMockMvc

  • @AutoConfigureMockMvc는 Mock 테스트 시 필요한 의존성을 제공받기 위해서 사용.
  • @Controller 뿐만아니라 테스트 대상이 아닌 @Service, @Repository 가 붙은 객체들도 모두 메모리에 올린다.

 

컨트롤러를 테스트 할 경우

@SpringBootTest 사용

  • @SpringBootTest를 사용할 경우 MockMvc를 사용 할 수 없어 @AutoConfigureMockMvc같이 선언해서 사용해야 합니다.
@SpringBootTest
@AutoConfigureMockMvc
class MyMockMvcTest {
    @Autowired
    private lateinit var mockMvc: MockMvc
}

 

@WebMvcTest 사용

  • @WebMvcTest 를 사용할 경우에는 별다른 주입 없이 MockMvc를 사용할 수 있지만 컨트롤러를 제외한 다른 Service, repository 객체들이 필요할 경우 Mock을 통해 주입받아 사용하여야 합니다.
@WebMvcTest
class MyMockMvcTest {
    @Autowired
    private lateinit var mockMvc: MockMvc

    @MockBean
    private lateinit var mockService: MockService
}

 

@WebFluxTest


Spring WebFlux를 테스트 하는데 사용합니다.

  • 스캔 범위
    • @Controller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, WebFilter, WebFluxConfigurer
  • MockBean, WebTestClient를 자동 구성한다.
@WebFluxTest
class MyMockWebTestClientTests {
    @Autowired
    private lateinit var webClient: webTestClient
}

 

@AutoConfigureWebTestClient

AutoConfigureMockMvc와 비슷하게 @SpringbootTest 어노테이션을 이용하여 테스트 할 경우 WebFlux 환경에서는 AutoConfigureWebTestClient를 주입받아야 WebTestclient 객체 사용이 가능합니다.

@SpringBootTest
@AutoConfigureWebTestClient
class MyMockWebTestClientTests {
    @Autowired
    private lateinit var webClient: WebTestClient
}

 

 

@DataJpaTest


  • JPA 관련 테스트를 하는데 사용합니다.
  • @Entity 클래스를 스캔 및 JPA과 관련된 설정만 등록합니다.
  • @Transactional 어노테이션이 자동으로 포함되어 있기 때문에 각각의 테스트는 자동으로 롤백처리가 된다
    • Transactional 기능이 필요하지 않으면 @Transactional(propagation = Propagation.NOT_SUPPORTED) 를 추가해주면 됩니다.
  • 기본적으로 in-memory embedd database에 대한 테스트를 진행합니다.
    • 실제 DB를 사용하여 테스트를 하고 싶은 경우 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) 를 추가해주면 된다.
// in-memory DB 사용
@DataJpaTest
class MyDataJpaTests {
}

// 실제 DB 사용
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class MyDataJpaTests {
}

 

@RestClientTest


  • Rest 통신이 예상대로 응답을 반환하는지 테스트 합니다.
  • Jackson, GSON, Jsonb support, RestTemplateBuilder, MockRestServiceServer를 자동 구성해준다.
  • 예를 들면, Apache HttpClient 나 Spring RestTemplate을 사용하여 외부 서버에 웹 요청을 보내는 경우에 이에 응답할 가상의 Mock서버를 만들어 테스트한다고 이해하시면 됩니다.
  • MockRestServiceServer를 자동 구성하여 테스트 가능합니다.
@RestClientTest
class MyRestClientTests(
    @Autowired
    private lateinit var server: MockRestServiceServer
}

 

 

마무리

이번 글에서 간단하게 살펴본 @SpringBootTest , @WebMvcTest , @WebFluxTest , @DataJpaTest , @RestClientTest 의외에도 auto-configure를 도와주는 여러 어노테이션이 존재합니다.

좀 더 다양한 어노테이션이 궁금하시면 여기에서 살펴보시고 상황에 맞춰서 필요한 어노테이션을 사용하시면 될것 같습니다!

 

 

참고자료

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함