
@Repository와 @Service는 등록하지 않는다. 사용할 것이라면 @MockBean을 사용해서 등록해줘야@SpringBootTest를 사용한 테스트보다는 가볍다.MockMVC
- 웹 앱을 애플리케이션 서버에 배포하지 않고도 테스트를 위한 요청을 제공하는 유틸리티 클래스이다. GET, POST< PATCH, DELETE 등의 요청을 생성해 보낼 수 있다.
- 비슷하게 WebTestClient와 TestRestTemplate도 API 테스트를 위해 사용할 수 있지만, 이들은 실제 서버를 구동시킨다는 점에서 다르다.
@AutoConfigureMockMvc를 사용하면 @WebMvcTest 없이도 MockMvc를 사용할 수 있다.@SpringBootTest와 함께 사용된다.@WebMvcTest와 다른 점은 Web Layer 관련 빈외에 @Service나 @Repository가 붙은 빈들도 스캔된다는 것이다.예시를 통해 사용 방법을 알아보자.
@WebMvcTest(GreetingController.class)
class WebMockTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private GreetingService service;
@Test
void greetingShouldReturnMessageFromService() throws Exception {
when(service.greet()).thenReturn("Hello, Mock");
this.mockMvc.perform(get("/greeting")).andDo(print()).andExpect(status().isOk())
.andExpect(content().string(containsString("Hello, Mock")));
}
}
GreetingController 클래스에 대한 테스트를 실행하는 코드이다.
@MockBean을 사용해 GreetingService를 Mock으로 주입받아 사용한다. 이를 통해 서비스단에 대한 의존성 없이 컨트롤러에 대한 단위테스트가 가능해진다./greeting 엔드포인트 GET 요청을 받아 응답 상태가 200 OK인지, 응답 내용에 특정 문자열이 포함되어 있는지 확인한다.@Tractional 어노테이션을 사용해 테스트 이후 rollback하도록 해야 한다.@Autowired로 다 주입된다.@SpringBootTest에서 MockMvc 객체를 사용하려면, @AutoConfigureMockMvc 어노테이션을 함께 선언해줘야@ExtendWith(SpringExtension.class)를 포함한다. (Junit5 기준)예시를 통해 살펴보자.
@SpringBootTest
@AutoConfigureMockMvc
class TestingWebApplicationTest {
@Autowired
private MockMvc mockMvc;
@Test
void shouldReturnDefaultMessage() throws Exception {
this.mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
.andExpect(content().string(containsString("Hello, World")));
}
}
Spring Data JPA 테스트를 위한 슬라이스 테스트 어노테이션이다.
@Entity가 선언된 클래스를 스캔하여 repository를 구성한다.@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(DataJpaTestContextBootstrapper.class)
@ExtendWith(SpringExtension.class)
@OverrideAutoConfiguration(enabled = false)
@TypeExcludeFilters(DataJpaTypeExcludeFilter.class)
@Transactional
@AutoConfigureCache
@AutoConfigureDataJpa
@AutoConfigureTestDatabase// -> this annotation!
@AutoConfigureTestEntityManager
@ImportAutoConfiguration
public @interface DataJpaTest {
}
replace, connection 등의 조건을 설정할 수 있다.@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2) 와 같이 설정하면 H2를 테스트 DB로 사용할 수 있다.@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) 와 같은 설정을 주면 내장된 메모리 DB로 변경하지 못하도록 막는다. (테스트 DB가 아닌 기존 DB를 사용하는 것이다.))이처럼 통합 테스트인지 단위테스트인지, 테스트하고자 하는 기능이 무엇인지에 따라 테스트를 위한 다양한 어노테이션을 사용할 수 있다.