Mockito 기반의 Controller 단위 테스트

iseon_u·2023년 5월 10일
1

TDD

목록 보기
3/3
post-thumbnail

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
    • 가짜 객체 생성
    • Service
  • MockMvc
    • 컨트롤러 테스트를 위한 HTTP 호출 필요

매장 등록 성공 테스트

@DisplayName("매장 등록 성공")
    @Test
    void 매장등록() throws Exception {
        //given
        final var request = 매장등록요청_생성();
        doNothing().when(storeService)
                .createStore(any(StoreRequestDto.class));

        //when
        ResultActions resultActions = mockMvc.perform(
                MockMvcRequestBuilders.post("/stores")
                        .contentType("application/json")
                        .content(new Gson().toJson(request))
        );

        //then
        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;

}
  • 컨텍스트 캐싱 대신 새로운 컨텍스트 생성이 필요하기 때문에 비교적 느리다
profile
🧑🏻‍💻 Hello World!

0개의 댓글