1. SpringBootTest

  1. Dependency[SpringBootTest]
    1. JUNit 5
      1. Java Application의 Unit Test를 위한 Test Tool
    2. Spring Test & Spring Boot Test
      1. SpringBoot Application에 대한 유틸리티 및 통합 Test를 지원함
    3. AssertJ
      1. 유연한 검증 라이브러리임
    4. Hamcrest
      1. Object Matcher를 위한 라이브러리임
    5. Mockito
      1. Java Mocking FrameWork임
    6. JSONassert
      1. JSON 검증을 위한 Tool
    7. JsonPath
      1. JSON용 XPath
  2. Annotation[SpringBootTest]
    1. @SpringBootTest
    2. @WebMvcTest
    3. @DataJpaTest
    4. @RestClientTest
    5. @JsonTest
    6. @JdbcTest
  3. @Autowired & @MockBean & @SpyBean
    1. 실제 Spring 컨텍스트를 사용해 Bean들을 등록함
    2. 등록된 Bean을 주입 받는 Annotation은 ⇒ @Autowired
    3. 특정 Object를 Mocking하고 싶은 경우는 ⇒ @MockBean, @SpyBean
    4. @MockBean ⇒ “해당 Object를 Mock된 Bean으로 등록함”
    5. @SpyBean ⇒ “해당 Object를 Spy된 Bean으로 등록함”
    6. 만약 @MockBean으로 선언한 Bean이 없다면 Mock Object를 bean으로 등록하지만, 동일한 Type과 이름의 Bean이 존재하면 해당 Bean은 Mock Bean으로 대체됨
    7. @SpyBean은 Spring 프록시가 적용된 Bean이면 사용이 불가능함, 프록시를 제거 후 사용해야함
  4. @SpringBootTest & @WebMvcTest & @DataJpaTest
    1. @SpringBootTest
      1. 통합 Test를 위한 환경을 준비해줌
      2. 모든 Bean들을 Scan하고 Application 컨텍스트를 생성하여 Test를 실행함
      3. 다양한 Value를 줄 수 있음
        1. value & properties - Application 실행에 필요한 Properties를 key=value 형태로 추가할 수 있음
        2. args - Application의 arguments로 값을 전달 할 수 있음
        3. classes - Application을 Loading할 때 사용되는 Component Class들을 정의 할 수 있음
        4. webEnviroment - web test환경을 설정할 수 있음
      4. @SpringBootTest - webEnvironment
        1. MOCK
          1. Web 기반의 Application 컨텍스트를 생성하지만, MOCK환경으로 제공하여 내장 SERVER가 시작되지 않음
          2. WEB 환경이 클래스패스에 없다면 WEB이 아닌 Application 컨텍스트를 생성함
          3. WEB기반의 Mock Test를 위해 @AutoConfigureMockMvc or @AutoConfigureWebTestClient와 함께 사용할 수 있음
        2. RANDOM_PORT
          1. WEB기반의 Application 컨텍스트를 생성하여 실제 WEB환경을 제공함
          2. 내장 Server도 실행되며 사용하지 않는 Random port를 listen함
        3. DEFINDED_PORT
          1. WEB 기반의 Application 컨텍스트를 생성하고 실제 WEB환경을 제공함
          2. 내장 Server도 실행되며 지정한 Port(default 8080)를 listen함
        4. NONE
          1. SpringApplication로 Application 컨텍스트를 생성함
          2. mock이나 다른 것들을 포함해 어떠한 WEB환경도 제공하지 않음
        5. webEnvironment의 default값은 MOCK이므로 실제 WEB Server가 실행되지 않음!
        6. @Transactional이 있으면 Test가 끝나고 트랜잭션을 롤백하는데, RANDOM_PORT나 DEFINDED_PORT를 사용하면 별도의 쓰레드에서 실제 Server가 구동되어 롤백이 되지 않음
        7. RANDOM_PORT, DEFINED_PORT를 사용하면 TestRestTemplate이 Dependency로 추가되므로 API 호출이 필요할 때 이용할 수 있음
      5. @SpringBootTest단점 & Slice Test
        1. @SpringBootTest는 기본적으로 모든 Bean을 탐색하고 등록을 함
        2. 특정 계층만 Test가 필요한 상황에 @SpringBootTest를 사용하면 불필요하게 무거워지고, 시간이 오래걸림!
        3. Spring에서 특정 부분만 Test할 수 있도록 Slice Test를 제공해주는데, Slice Test는 Spring 컨텍스트를 구성하므로 통합테스트에 해당됨
    2. @WebMvcTest - Controller
      1. Application 컨텍스트를 만들 때 Controller와 연관된 Bean들만을 제한적으로 찾아서 등록함
      2. @Component, @ConfigurationProperties Bean들은 Scan되지 않음
        1. @Controller, @RestController
        2. @ControllerAdvice, @RestControllerAdvice
        3. @JsonComponent
        4. Filter
        5. WebMvcConfigurer
        6. HandlerMethodArgumentResolver
      3. @Import를 사용할 수 있으며, @MockBean, SpyBean 도 사용이 가능함
      4. @WebMvcTest는 Controller Test이므로 @WebMvcTest 내부에 @AutoConfigureMockMvc가 있음
      5. @Autowired로 MockMvc를 주입 받을 순 있지만, 만약 WebFlux를 이용중이면 @WebFluxTest를 사용하면 됨
    3. @WebMvcTest - value, controllers
      1. 특정 Controller만 Bean으로 등록하다록 제한 할 수 있음
      2. [주의]
        1. 특정 Controller만을 Bean으로 띄우고 @MockBean과 @SppyBean으로 특정 Bean을 바꾸는 것은 새로운 Application 컨택스트를 필요로 하는데, 계속해서 수를 증가시키는 문제가 발생하므로 사용 시 주의해야함!
    4. @DataJpaTest - JPA Repository
      1. @DataJpaTest
        1. @Entity가 있는 Entity calss들을 Scan하며 Test를 위한 TestEntityManager를 사용해 JPA Repository들을 설정해줌
        2. @Component, @ConfigurationProperties Bean들은 Scan 되지 않음을 알아야함
      2. @DataJpaTest의 기본적인 동작
        1. Spring Test에 @Transactional이 있으면 Test가 끝난 후 Auto로 트랜잭션을 롤백함
        2. @Transactional Annotation이 들어 있어서 기본적으로 모든 Test가 롤백이 가능함
        3. @Rollback(false)를 설정하면 롤백을 하지 않음!
        4. H2간은 내장 DB가 클래스 패스에 존재하면 내장 DB가 Auto로 구성됨
        5. spring-boot-test dependency에는 기본적으로 h2가 들어있으며 별다른 설정을 주지 않으면 h2로 설정이 됨
        6. 내장 DB로 설정되기 원하지 않으면, AutoConfigureTestDatabase의 replace 속성을 NONE을 주면 됨
  5. Application 컨텍스트 캐싱
    1. 내부적으로 Spring 컨텍스트를 캐싱해두고 동일한 설정이라면 재사용함을 말함
    2. Test시 새로운 컨텍스트를 생성하도록 요구함
    3. @MockBean과 @SpyBean은 특정 Bean을 Mock이 적용된 Bean으로 등록함
    4. Application 컨텍스트가 갖는 Bean이 달라져 새로운 컨텍스트를 생성함
    5. @MockBean과 @SpyBean을 많이 사용하면 Test가 느려질 수 있기에, 캐싱된 Application의 수를 증가시킴
    6. Test Class에서 @MockBean과 @SpyBean이 적용된 Object가 완전히 동일하다면 재사용이 가능함
  6. SpringBootTest - Annotation 정리