-
Mock 프레임워크란? (+ Mockito 프레임워크 사용 예시)테스트코드(Test Code) 2022. 5. 13. 14:40반응형
Mock이란?
https://junuuu.tistory.com/203?category=981663
Mock 객체란?
Mock 객체란? Mock은 사전적 의미로 모조품이라는 뜻을 가집니다. 즉, 제품의 외양을 흉내 낸 모조품을 말하며 소프트웨어에서는 모듈의 겉모양이 실제 모듈과 비슷하게 보이도록 만든 가짜 객체
junuuu.tistory.com
Mock 프레임워크란?
- Mock 객체를 직접 작성해서 명시적인 클래스로 만들지 않아도 됩니다.
- Mock 객체에 대해서 행위까지도 테스트 케이스에 포함시킬 수 있습니다.
Mock 객체를 직접 만드는 것 자체가 별로 부담은 되지 않지만 Mock 클래스 숫자가 점점 늘어나게 되면 관리에 부담이 발생합니다.
따라서 Mock 프레임워크를 사용하면 Mock 객체를 편리하게 관리할 수 있습니다.
Mockito란?
Mock 객체를 쉽게 만들고 관리하고 검증할 수 있는 방법을 제공하는 Mock 프레임워크 중 하나입니다.
JMock, EasyMock이라는 프레임워크들도 존재하지만 테스트를 작성하는 자바 개발자의 45%가 Mockito를 사용합니다.
구현체가 아직 없는 경우나 구현체가 있더라도 특정 단위만 테스트하고 싶을 경우 사용할 수 있도록 적절한 환경을 제공합니다.
왜 Mockito를 사용해야 할까?
- Mock 객체를 직접 작성해서 명시적인 클래스로 만들지 않아도 됩니다.
- Mock 객체에 대해서 행위까지도 테스트 케이스에 포함시킬 수 있습니다.
다른 Mock 프레임워크와 Mockito의 차별점
테스트의 행위와 반응에만 집중해서 테스트 메서드를 작성할 수 있게 합니다.
Mock 객체를 직접 만드는 것 자체가 별로 부담은 되지 않지만 Mock 클래스 숫자가 점점 늘어나게 되면 관리에 부담이 발생합니다.
Mockito 사용법
Mock 객체 의존성 주입법
@Mock : Mock 객체를 만들어 반환해주는 어노테이션
@Spy : Stub하지 않은 메서드들은 원본 메서드 그대로 사용하는 어노테이션
@InjectMocks: @Mock 또는 @Spy로 생성된 가짜 객체를 자동으로 주입시켜주는 어노테이션
예를 들어 UserController에 대한 단위 테스트를 작성하고자 할 때 UserService를 사용하고 있다면 @Mock 어노테이션을 통해 가짜 UserService를 만들고, @InjectMocks를 통해 UserController에 이를 주입시킬 수 있습니다.
Stub로 결과 처리
@Mock을 통하여 가짜 객체를 주입하였기 때문에 어떤 결과를 반환하라고 정해진 답변을 준비시켜야 합니다.
doReturn() : Mock 객체가 특정한 값을 반환하도록 합니다.
doNothing(): Mock 객체가 값을 반환하지 않도록 합니다. (void)
doThrow(): Mock 객체가 예외를 발생시키도록 합니다.
Mockito와 Junit의 결합
Mockito도 테스팅 프레임워크이기 때문에 JUnit과 결합되기 위해서는 별도의 작업이 필요합니다.
JUnit4에서는 Mockito를 활용하기 위해 클래스 어노테이션으로 @RunWith(MockitoJUnitRunner.class)를 붙여야 합니다.
JUnit5에서는 @ExtendWith(MockitoExtension.class)를 사용하면 됩니다.
Spring Boot Controller를 테스트하기 위한 Mockito 사용 예시
@ExtendWith(MockitoExtension.class) public class MemberControllerWithMockitoTest { @InjectMocks private MemberController memberController; @Mock private MemberService memberService; private MockMvc mockMvc; @BeforeEach public void init() { mockMvc = MockMvcBuilders.standaloneSetup(memberController).build(); } @Test @DisplayName("Hello Test") public void returnOkMessage() throws Exception { //given String ok = "ok"; //when ResultActions resultActions= mockMvc.perform(get("/members")); //then resultActions .andExpect(status().isOk()) .andExpect(content().string(ok)); } }
Spring Boot Controller를 테스트하기 위한 Mockito + @WebMvcTest 사용 예시
@WebMvcTest class MemberControllerTest { @Autowired private MockMvc mvc; @MockBean private MemberService memberService; @Test @DisplayName("Hello Test") public void returnOkMessage() throws Exception { //given String ok = "ok"; //when mvc.perform(get("/members")) //then .andExpect(status().isOk()) .andExpect(content().string(ok)); } }
구현체가 아직 없는 경우나 구현체가 있더라도 특정 단위만 테스트하고 싶을 경우 사용할 수 있도록 적절한 환경을 제공합니다.
위의 글은 Mockito를 소개했었던 내용입니다.
여기서는 MemberController 클래스가 memberService를 의존하고 있습니다.
여기에서 MemberController만 테스트하고 싶습니다. (특정 단위만 테스트하고 싶음)
그렇기 때문에 MemberService는 Mockito 프레임워크의 @MockBean 어노테이션을 통해 Mock객체를 쉽게 만들 수 있습니다.
출처
https://mangkyu.tistory.com/145
[Spring] JUnit과 Mockito 기반의 Spring 단위 테스트 코드 작성법 (3/3)
이번에는 Spring 기반의 웹 애플리케이션에서 테스트를 작성하는 방법에 대해 알아보도록 하겠습니다. 1. Mockito 소개 및 사용법 [ Mockito란? ] Mockito는 개발자가 동작을 직접 제어할 수 있는 가짜(Mock
mangkyu.tistory.com
'테스트코드(Test Code)' 카테고리의 다른 글
easyRandom으로 테스트코드를 편하게 작성하기 (0) 2024.06.06 인수테스트란 무엇인가? (0) 2023.12.28 테스트 코드 - 회원 관리 예제 실습(스프링 통합 테스트) (0) 2022.04.24 Mock 객체란? (0) 2022.03.15 테스트 커버리지? 코드 커버리지란? (0) 2022.03.07