ABOUT ME

Today
Yesterday
Total
  • 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

     

    댓글

Designed by Tistory.