본문 바로가기
Develop/Spring

Testing - Mockito

by jaeyoungb 2022. 11. 13.

Mock이란?

가짜 객체를 의미한다. 단위 테스트나 슬라이스 테스트 등에 Mock 객체를 사용하는 것을 Mocking이라고 한다.

 

 

테스트에서 Mock 객체를 사용하는 이유

Mock 객체를 사용하지 않는 슬라이스 테스트 실행 흐름을 보면 다음과 같다.

(Controller를 테스트하기 위한 슬라이스 테스트)

https://www.parasoft.com/blog/love-spring-testing-even-more-with-mocking-and-unit-test-assistant/

 

Controller만을 테스트 한다기에는 서비스 계층과 데이터 액세스 계층, 그리고 데이터베이스까지 동작 흐름이 이어진다는 것을 알 수 있다. (거의 통합 테스트라고 봐도 무방하다)

이 경우에 하나의 계층만을 테스트 하는 슬라이스 테스트의 목적에 맞지 않는다.

 

 

이때 필요한 것이 바로 Mock 객체이다.

Mock 객체를 사용한 Controller의 슬라이스 테스트 실행 흐름을 보자.

https://www.parasoft.com/blog/love-spring-testing-even-more-with-mocking-and-unit-test-assistant/

Mock 객체를 사용함으로써, 다른 계층과의 연결을 단절시킬 수 있다는 장점이 있다. 이로써, 테스트하려는 대상에만 집중해서 테스트를 수행할 수 있다.

 

 

Mockito란?

Mock 객체를 생성하고, 해당 Mock 객체가 진짜처럼 동작하게 하는 역할을 담당한다.

(여러 Mocking 라이브러리가 있지만, Spring Framework 자체적으로 지원하는 것은 Mockito이다)

 

 

슬라이스 테스트에 Mockito 적용

MemberController의 postMember() 테스트에 Mockito 적용

  • (1) Application Context에 등록되어 있는 Bean에 대한 Mockito Mock 객체를 생성하고 주입
  • (2) 해당 필드의 Bean에 대한 Mock 객체를 생성한 후, 필드에 주입(DI)
    (MemberMapper를 DI 받는 이유는 MockMemberService의 createMember()에서 리턴하는 Member 객체를 생성하기 위함)
  • (3) post 변수를 Member 객체로 변환
  • (4) Stamp 객체도 추가
  • (5) Mockito에서 지원하는 Stubbing 메서드
    • given()은 Mock 객체가 특정 값을 리턴하는 동작을 지정하는데 사용
      Mockito에서 지원하는 when()과 동일한 기능
    • .willReturn()
      MockMemberService의 createMember() 메서드가 리턴할 Stub 데이터
Stubbing
테스트를 위해서 Mock 객체가 항상 일정한 동작을 하도록 지정하는 것을 의미

 

 

테스트 코드를 작성한 후, 실행 결과는 다음과 같다.

실행 결과 일부

MockMemberService의 createMember() 메서드가 호출되므로, 데이터 액세스 계층쪽의 로직은 실행이 되지 않는다.

 

 

 

MemberController의 postMember() 핸들러 메서드 내에 다음과 같이 breakpoint를 추가하고

 

MemberControllerMockTest 클래스를 디버그 모드로 실행해보면 다음과 같은 결과를 얻을 수 있다.

그림과 같이 memberService 객체의 정체는 Mockito의 Mock 객체인 것을 확인할 수 있다.

 

 

 

MemberService의 createMember() 테스트에 Mockito 적용

  • (1) Spring을 사용하지 않고, Junit에서 Mockito의 기능을 사용
  • (2) 해당 필드의 객체를 Mock 객체로 생성
  • (3) Mock 객체를 주입해 줍니다.(memberService 객체는 주입 받은 memberRepository Mock 객체를 포함)
  • (4) (2)에서 생성한 memberRepository Mock 객체로 Stubbing
  • (5) Optional.of()로 지정했기 때문에, 테스트 케이스를 실행하면 결과는 'passed'

 

 

정리

  • Mock은 가짜 객체를 의미
  • Mockito는 Mock 객체를 생성하고, 해당 Mock 객체가 진짜처럼 동작하게 하는 기능을 하는 Mocking framework(또는 라이브러리)이다.
  • @MockBean 애너테이션은 Application Context에 등록되어 있는 Bean에 대한 Mockito Mock 객체를 생성하고 주입하는 역할을 한다.
  • Junit에서 Spring을 사용하지 않고, 순수하게 Mockito의 기능만을 사용하기 위해서는 @ExtendWith(MockitoExtension.class)를 클래스 레벨에 추가한다.
  • @Mock 애너테이션을 추가하면 해당 필드의 객체를 Mock 객체로 생성한다.
  • @Mcok 애너테이션을 통해 생성된 Mock 객체는 @InjectMocks 애너테이션을 추가한 필드에 주입된다.
  • Mockito의 사용법에 대해

'Develop > Spring' 카테고리의 다른 글

Spring Rest Docs - Asciidoc  (0) 2022.11.14
TDD  (0) 2022.11.13
Spring Rest Docs  (0) 2022.11.12
Spring MVC - API 문서화  (1) 2022.11.12
Spring MVC - Testing(2)  (0) 2022.11.09