이전에도 말했듯
회사에 입사하기 위해
과제전형을 한 적이 있는데,
그 때 테스트 코드를 같이 제출했었다.
당시에는 테스트 코드를 짜본적이 없었기에
급하게 django에서 제공하는 test 모듈을 썼었고
그랬기에 Unit test만 작성하여 제출했었다.
이번에 spring에서 test를 학습하면서
slice test도 있다는 것을 알게되었고,
그래서 학습 내용을 정리하고자 한다.
단위 테스트는
최대한 독립적인 것이 좋고,
최대한 작은 단위인 것이 좋다고 했었다.
하지만 이 단위 테스트는 가장 작은 단위로
구분하여 케이스를 작성하기 때문에
계층별로 잘 작동하는지는 알기 어렵다.
그래서 특정 계층만 slice해서 테스트하는 것을
Slice Test라고 한다.
MockMvc
를 사용해 테스트를 진행한다.
@SpringBootTest
@AutoConfigureMockMvc
class APITest{
@Autowired
private MockMvc mockMvc;
@Test
void testCase1() throws Exception {
//given
...
// when
ResultActions action = mockMvc.perform(
...
);
// then
actions.
andExpect(...
}
}
@SpringBootTest
를 사용하여 테스트 클래스를 생성
@AutoConfigureMockMvc
를 사용하면
테스트 대상 계층에서 필요한 Dependency를 찾아
알아서 등록한다.
MockMvc를 주입받고,
목적에 따라 given을 설정
mockMvc.perform(...)
을 통해 when을 설정
perform의 결과를 통해 then을 설정
@DataJpaTest
public class DataAcessTest {
@Autowired
private EntityRepository entityRepository;
@Test
public void testCase1() {
// given
...
// when
Entity entity = entityRepository.save(...);
// then
assertTrue(...
}
}
DataJpaTest
를 사용해 테스트를 진행한다.
DataJpaTest
에는 Transactional
annotation이 있기 때문에 repository를 통해 save를 하더라도Mockito는 계층별 test에 필요한 Dependency를
mock 객체로 대체하여 진행하기 때문에
테스트 대상에만 집중할 수 있다.
import static org.mockito.BDDMockito.given;
@SpringBootTest
@AutoConfigureMockMvc
class APITest{
@Autowired
private MockMvc mockMvc;
@MockBean
private EntityService service;
...
@Test
void testCase1() throws Exception {
// given
...
given(service.createEntity(Mockito.any(Entity.class)).willReturn(entity);
// when
ResultActions actions = mockMvc.perform(...
// then
action.andExpect(...
}
}
@MockBean
을 통해 해당 계층에 필요한
Dependency를 가짜로 생성하여 테스트를 진행한다
given
static 메서드를 통해.willReturn()
에 들어오는 값을 return한다는 의미이다.MockBean
과 Mock
이 있는데,Bean
으로 등록된 객체라면 MockBean
Mock
annotaion을 사용해 선언한다.Slice Test에 대해 학습을 해보니
내가 이전에 면접을 위해 제출했던 과제에 작성한
테스트는 Unit Test보다는 Slice Test에 가까웠던거 같다.
Mockito
를 사용한 test 작성법이
독특해서 기억에 남는거 같다.