테스트코드(Test Code)

Mock 프레임워크란? (+ Mockito 프레임워크 사용 예시)

Junuuu 2022. 5. 13. 14:40
728x90

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