Mockito 기반의 Controller 단위 테스트
Mockito 어노테이션 종류
@Mock
- 가짜 객체를 만들어주는 어노테이션
- 테스트할 레이어에 필요한 객체를 사용
@Spy
@InjectMocks
- Mock 객체가 주입되어야 하는 대상 객체 생성 및 주입
Mockito 메서드
doReturn()
doNothing()
- 가짜 객체가 아무 것도 반환하지 않는 경우
- void인 경우
doThrow()
단위 테스트 작성
의존성 주입 및 HTTP 호출을 위한 MockMVC
@ExtendWith(MockitoExtension.class)
class StoreControllerTest {
@InjectMocks
private StoreController storeController;
@Mock
private StoreService storeService;
private MockMvc mockMvc;
@BeforeEach
public void init() {
mockMvc = MockMvcBuilders.standaloneSetup(storeController).build();
}
}
@InjectMocks
- 테스트 대상
- 가짜 객체 주입
- Controller
@Mock
- MockMvc
매장 등록 성공 테스트
@DisplayName("매장 등록 성공")
@Test
void 매장등록() throws Exception {
final var request = 매장등록요청_생성();
doNothing().when(storeService)
.createStore(any(StoreRequestDto.class));
ResultActions resultActions = mockMvc.perform(
MockMvcRequestBuilders.post("/stores")
.contentType("application/json")
.content(new Gson().toJson(request))
);
resultActions.andExpect(status().isCreated());
}
any()
- 조건을 충족하는 요소가 있는지 여부 테스트
- 지정한 클래스 타입이면 어떤 객체도 처리할 수 있도록 지정
- Gson
Spring Boot에서 @WebMvcTest 사용
@WebMvcTest
- MockMvc 객체 자동 생성
- ControllerAdvice, Filter, Interceptor 등을 빈으로 등록
@Mock
, @Spy
대신 @MockBean
, @SpyBean
사용
@WebMvcTest(StoreController.class)
class StoreControllerTest {
@MockBean
private StoreService storeService;
@Autowired
private MockMvc mockMvc;
}
- 컨텍스트 캐싱 대신 새로운 컨텍스트 생성이 필요하기 때문에 비교적 느리다