본문 바로가기
부트캠프 개발일기/Spring MVC

56일차: Mockito

by shyun00 2023. 5. 2.

❯  Mock

사전적으로 "가짜의, 모의의, 거짓의" 라는 뜻을 가진다.

진짜와 유사하게 기능을 테스트 해볼 수 있도록 하는 가짜 객체를 의미한다.

프로그래밍에서 Mock 객체를 사용하는 것을 Mocking 이라고 한다.

테스트에서 Mock 객체를 사용하는 이유는 슬라이스 테스트 등에서 해당 테스트 영역에 집중하기 위해서이다.

Mock 객체를 사용하지 않을때는 Controller 테스트를 위해서 서비스계층과 데이터 액세스 계층까지 흐름이 이어진다.

이 때 Mock 서비스 객체를 사용해서 Mock 객체의 메서드를 호출함으로써 다른 계층들까지 흐름이 이어지지 않는다.

Mockito

Mock 객체로 Mocking을 할 수 있게 해주는 대표적인 오픈 소스 라이브러리이다.

1. @MockBean

@MockBean 애너테이션을 사용해 Application Context 에 등록된 Bean에 대해서 Mock 객체를 생성하고 주입할 수 있다.

이때 Mock 객체에서 사용되는 개념이 Stubbing이다. Mock 객체가 어떤 동작을 요청받으면 일정한 동작을 하도록 지정하는것을 의미한다.

 

예를들어 given(memberService.createMember(Mockito.any(Member.class)).willReturn(member)); 라는 코드를 보면

  • given( ): 특정 값을 리턴하도록 동작을 지정하는데 사용하는 메서드이다.
  • memberService.createMember( ): 어떤 동작을 할 때인지를 지정한다. (when 의 역할)
  • Mockito.any(Member.class): Mockito에서 지원하는 변수타입 중 하나로 Member클래스 객체가 파라미터로 들어감을 의미한다.
  • willReturn(member): 어떤 Member 클래스 객체가 파라미터로 들어오더라도, 항상 이미 지정되어있는 member 객체를 리턴한다는것을 의미한다.

여기서 member 는 Stub데이터인데, Mock 객체를 통해 메서드가 호출되면 항상 같은 데이터를 리턴하도록 설정된 것이다.

실제 서비스 계층의 로직을 수행하지 않고 

 

2. @ExtendWith(MockitoExtension.class)

@SpringBootTest를 사용하게되면 애플리케이션의 모든 설정을 완료하고 테스트가 진행된다. 서비스 계층(비즈니스 로직)을 테스트 할때빠르게 테스트를 수행하기 위해서는 해당 부분만 테스트 하도록 설정하는것이 좋다.

이때 사용되는 것이 @ExtendWith(MockitoExtension.class) 애너테이션으로, JUnit에서 Mockito 라이브러리를 쓸 수 있도록 해준다.

테스트 클래스 내부에서 필드에  @Mock를 붙이면 해당 필드 객체를 Mock 객체로 생성한다.

@InjectMocks 애너테이션을 사용하면 생성된 Mock 객체를 대상 객체에 주입한다.