@Before, @After, @AfterReturning, @AfterThrowing, @AroundApplicationContext 객체의 메서드가 호출되면 IoC 컨테이너가 이를 감지하여 대상 객체를 감싸는 프록시 객체를 생성한다@Aspect 애너테이션을 사용한다@BeforeAll : 테스트 클래스 인스턴스를 초기화할 때 가장 먼저 실행된다@BeforeEach: 모든 테스트 메서드가 실행되기 전 각각 한번씩 실행된다@AfterAll: 테스트 클래스의 모든 테스트 메서드가 실행을 마치면 마지막으로 한 번만 실행된다@AfterEach: 모든 테스트 메서드가 실행된 후 각각 한번 씩 실행된다@SpringBootTestWebEnvironmnet 속성application.properties에 정의된 포트를 사용하여 서블릿 컨테이너를 실행한다@SpringBootTest(properties={"search.host=127.0.0.1", "search.port=19999"})application.properties 에 같은 키 이름의 값이 있다면 그 값을 @SpringBootTest 애너테이션에 설정된 값으로 대체한다@SpringBootTest(properties={"spring.config.location=classpath:application-test.properties"})@TestConfiguration 을 이용한 테스트 환경 설정@TestConfiguration 애너테이션이 사용된 클래스에는 @Bean 으로 정의한 스프링 빈을 하나 이상 포함할 수 있다.@MockBean 을 사용한 테스트 환경설정Spring-boot-starter-test 는 spring-boot-test 모듈을 포함하고 있다.@MockBean 애너테이션을 제공한다Mockito 는 목(mock) 객체를 만들고, 목 객체의 행동과 결과를 검증할 수 있는 기능을 제공한다 (테스트 환경 설정부터 테스트 검증까지)@MockBean은 목 객체를 생성하고 주입하는 방법과 목 객체의 행동을 설정하는 방법을 설정한다@Mock vs @MockBean: @Mock은 Junit과 Mockito를 사용하여 일반 자바 객체를 테스트하는데 사용하는 반면 @MockBean은 스프링의 ApplicationContext를 사용하여 스프링 빈을 목 객체로 만들어 주입할 수 있다@MockBean 을 정의하고 실행하면 별도의 설정 없이 목 객체가 생성된다ApplicationContext에 추가된다. ( 목객체와 같은 클래스타입, 같은 이름의 스프링 빈은 목 객체로 바뀐다)ApplicationContext는 목객체를 주입받기 원하는 스프링 빈에 목객체를 주입한다@SpringBootTest으로 테스트를 실행하면 ApplicationContext를 이용하여 스프링 빈을 스캔하고 의존성 주입을 한다. 그러므로 테스트 시간이 늘어날 수 있다ApplicationContext가 스캔해야 하는 스프링 빈의 개수도 줄어들고, 기능도 초기화하지 않아도 된다@WebMvcTest: 스프링 MVc 프레임워크의 기능을 테스트한다@Controller, @ControllerAdvice 를 스캔하고 Converter, Filter, WebMvcConfigurer 같은 MVC 기능도 제공한다@Service, @Component, @Repository 로 정의된 스프링 빈들은 스캔하지 않는다@DataJpaTest: JPA 기능을 테스트할 수 있다. @Repository 대상으로 스캔한다@Service, @Component, @Controller 로 정의된 스프링 빈들은 스캔하지 않는다@JsonTest: Json 직렬화, 역직렬화를 테스트할 수 있다.@Service, @Component, @Controller, Repository 로 정의된 스프링 빈들은 스캔하지 않는다@RestClientTest: HTTP 클라이언트의 동작을 테스트할 수 있는 기능@Service, @Component, @Controller, @Repository 로 정의된 스프링 빈들은 스캔하지 않는다@DataMongoTest: MongoDB를 테스트하기 위한 기능@WebMvcTestMockMvc: 실제로 HTTP 프로토콜을 사용하여 서버의 API 를 호출하지 않고, 요청을 전송하고 응답을 받아 올 수 있는 기능을 제공하는 객체MockMvcRequestBuilders, MockMvcResultMatchers, ResultActionsMockMvcRequestBuilders: HTTP 요청을 목 객체로 만들 수 있는 기능MockMvcResultMatchers: HTTP 응답 메세지를 검증할 수 있는 기능ResultActions: 응답 메시지의 각 속성에 접근할 수 있는 메서드제공@AutoConfigureMockMvc: MockMvc 객체는 MockMvcBuilders 클래스를 이용하여 생성할 수 있지만 위의 어노테이션을 정의하면 MockMvc 객체를 스프링 빈으로 주입받을 수 있다@SpringBootTest 애너테이션을 사용하여 스프링 MVC 기능을 테스트할 때 같이 사용한다@WebMvcTest 어노테이션은 @AutoConfigureMockMvc 애너테이션 없이도 MockMvc 객체를 생성한다jsonPath() 메서드를 사용하면 JSON 응답 메시지의 속성 값을 검증할 수 있다$: 조회할 최상위 JSON 엘리먼트이다[(index)]: JSON 배열의 인덱스 값과 같이 사용하여 해당 위치의 JSON 엘리먼트를 참조할 수 있다.<name>: 엘리먼트의 자식을 참조한다$[0].hotelName: JSON 배열 형태의 응답메세지에서 첫번째 JSON 엘리먼트의 hotelName 값을 참조한다@DataJpaTest데이터를 처리하는 영역을 구분하여 빠르게 테스트하는 방법이다
@Repository 애너테이션은 데이터베이스에 데이터를 생성 삭제 수정 조회하는 기능을 제공하는 클래스를 스프링 빈으로 정의할 때 사용한다@DataJpaTest 는 @Repository 만 스캔한다
@Transactional: 테이스케이스에 @Transactional 애너테이션이 정의되면 테스트 종료 후 롤백된다
@DataJpaTest 내부에 @Transactional 애너테이션을 포함하고 있다.만약 @SpringBootTest의 environment 속성이 RANDOM_PORT나 DEFINED_PORT로 설정하면 롤백되지 않는다.
이 설정시에는 별도의 서블릿 컨테이너가 실행된다. 테스트 케이스를 실행하는 스레드와 테스트 케이스가 호출한 서블릿 컨테이너의 스레드가 서로 달라 서블릿 컨테이너의 트랜잭션을 테스트 케이스에서 롤백할 수 없기 때문이다.
@Autowired@WebMvcTest