Mock 프레임워크란? (+ Mockito 프레임워크 사용 예시)
Mock이란?
https://junuuu.tistory.com/203?category=981663
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