properties: 테스트가 실행되기전에 {key=value} 형식으로 프로퍼티를 추가할 수 있습니다.
classes: 애플리케이션 컨텍스트에 로드할 클래스를 지정합니다. 따로 지정하지 않으면 @SprongBootConfiguration을 찾아서 로드합니다.
webEnvironment: 애플리케이션이 실행될 때의 웹 환경을 설정할 수 있습니다. 기본값은 Mock 서블릿을 로드하여 구동되며 예제에서는 랜덤 포트값을 지정
추가적인 팁
프로파일 환경을 갖는다면 @ActiveProfiles("test")과 같은 방식으로 원하는 프로파일 환경값을 부여 가능
테스트에서 @Transactional을 사용하면 테스트를 마치고 나서 수정된 데이터가 롤백됩니다. 다만 테스트가 서버의 다른 스레드에서 실행 중이라면 WebEnvironment.RANDOM_PORT, DEFINED_PORT를 사용하여 테스트를 수행하면 트랜잭션이 롤백되지 않습니다.
@Transactional 어노테이션을 붙여주면 자동으로 rollback 처리됩니다.
@WebMvcTest
MVC를 위한 테스트, 웹에서 테스트하기 힘든 컨트롤러를 테스트하는데 적합하다.
웹상에서 요청과 응답에 대한 테스트 진행
시쿠리티 혹은 필터까지 자동으로 테스트하며 수동으로 추가/삭제 가능
@WebMvcTest 어노테이션을 사용하면 MVC 관련된 설정인 @Controller, @ControllerAdvice, @JsonCompoent와 Filter, WebMvcConfiguer, HandlerMetohdAgumentResolver만 로드되기 때문에 @SpringBootTest 어노테이션 보다 가볍게 테스트할수 있습니다.
@Test publicvoidbook_save_test(){ final Book book = new Book("title", 1000D); final Book saveBook = bookRepository.save(book); assertThat(saveBook.getId(), is(notNullValue())); }
@Test publicvoidbook_save_and_find(){ final Book book = new Book("title", 1000D); final Book saveBook = bookRepository.save(book); final Book findBook = bookRepository.findById(saveBook.getId()).get(); assertThat(findBook.getId(), is(notNullValue())); } }
@AutoConfigureTestDatabase 어노테이션의 기본 설정값인 Replace.Any를 사용하면 기본적으로 내장된 데이터소스를 사용합니다.
위와 같이 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)을 지정하면 @ActiveProfiles("test") 기준으로 프로파일이 설정됩니다.
@DataJpaTest는 테스트가 끝날 때마다 자동으로 테스트에 사용한 데이터를 롤백합니다.
@Rule로 지정한 필드 값은 @Before, @After 어노테이션에 상관없이 하나의 테스트가 메서드가 끝날 때마다 정의한 값으로 초기화 시켜줍니다. 테스트에서 자체적으로 자체적으로 규칙을 정의하여 재사용할 때 유용합니다.
MockRestServiceServer는 클라이언트와 서버 사이의 REST 테스트를 위한 객체입니다. 내부에서 RestTemplate를 바인딩하여 실제로 통신이 이루어지게끔 구성할 수도 있습니다. 이 코드에서는 목 객체와 같이 실제로 통신이 이루어지지는 않지만 지정한 결로에 예상되는 반환값을 명시합니다.
rest_test() 메서드는 요청에 대한 응답과 기댓값이 같은지 테스트합니다. 요청을 보내면 현지 리소스 폴더에 있는 test.json 데이터로 응답을 주도록 설정합니다(목 객체와 비슷한 개념입니다.).
@JsonTest
@JsonTest는 JSON의 직렬화, 역직렬화를 수행하는 라이브러인 Gson과 Jackson의 테스트를 제공합니다.