Springboot Test
1. 슬라이스 테스트
1) application-test.propertiess
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.hikari.jdbc-url=jdbc:h2:mem:testdb
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
2) Test Class
@ActiveProfiles("test")
@WebMvcTest
//@AutoConfigureMockMvc
public class EventControllerTest {
@Autowired
MockMvc mockMvc;
@Autowird
// Object를 JacksonJson을 이용해 JSON형태로 변경해준다
ObjectMapper objectMapper;
@MockBean
EventRepository eventRepository;
@Test
@DisplayName("Event Create 테스트")
public void createTest() {
// Given
Event event = Event.build()
...
build();
// 가상객체라 ID가 자동으로 생성되지 않아서 수동으로 등록해야한다
event.setId(10);
// eventRepository.save(event)가 호출되면 event를 리턴하라
Mockito.when(eventRepository.save(event)).thenReturn(event);
// When & Then
mockMvc.perform(post("/api/events")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaTypes.HAL_JSON)
.content(objectMapper.writeValueAsString(event)))
.andDo(print())
.andExpect(status().isCreated())
// print()을 통해 Console로 output되는 JSON을 볼 수 있다.
.andExpect(jsonPath("id").exists())
.andExpect(jsonPath("free").value(false))
.andExpect(jsonPath("content[0].objectName").exists())
// header 테스트
.andExpect(header().exists(HttpHeaders.LOCATION))
.andExpect(header().string("Content-Type", "application/hal+json;charset=UTF-8")) // 아래줄과 동일 의미
.andExpect(header().string(HttpHeaders.CONTENT_TYPE, HttpHeaders.HAL_JSON_VALUES));
}
}
2. 어노테이션 & 빈
1) @WebMvcTest
Web관련 빈만 등록하며, MockMvc 빈을 자동 등록해준다.
2) @AutoConfigureMockMvc
@SpringBootTest설정으로 모킹한 객체를 의존성 주입받으려면 @AutoCOnfigureMockMvc를 클래스 위에 추가 해야한다.
2) MockMvc
MVC 테스트의 핵심클래스. 웹서버를 구동하지 않고 MVC (Dispatch Servlet) 요청을 처리하는 과정을 확인할 수 있도록 해준다
@WebMvcTest (Web테스트), @SpringBootTest (Application테스트)
3) @MockBean
Mockito를 이용해 mock(가상) 객체를 만들고 빈으로 등록해준다
(주의) 기존빈을 테스트용 빈이 대체한다
5) @DisplayName
Test Method의 설명을 Name으로 보여준다