Mocktio - Spring 단위 테스트

2023. 5. 10. 19:50Spring

728x90

Mockito 소개


Mockito는 개발자가 동작을 직접 제어할 수 있는 가짜 객체를 지원하는 테스트 프레임 워크이다.

일반적으로, Spring으로 개발하다보면 여러 객체들에게 의존성이 생기는 데 이때 Mockito 라이브러리를 사용하면 단위테스트를 수월하게 진행할 수 있다.

 

스프링 부트 2.2부터는 프로젝트 생성 시 spring-boot-start-test에서 자동으로 Mockito를 추가해준다.

현재 본인은 스프링 부트 2.7.5버전이므로, spring-boot-start-tset에서 자동으로 Mockito를 추가해주는 것을 알 수 있다.

 

 

Mockito 사용법


Mock 객체 의존성 주입

 

Mockito에서 가짜 객체의 의존성 주입을 위해서는 크게 3가지 어노테이션을 사용할 수 있다.

 

  • @Mock : 가짜 객체를 만들어 반환해주는 어노테이션
    • 이 객체에서 메소드를 호출하려면, 반드시 스터빙을 해야한다.
    • 만약, 스터빙을 하지 않고, 그냥 호출한다면 primitive type은 0, 참조형은 null을 반환한다.
  • @Spy : 진짜 객체를 만들어 반환해주는 어노테이션
    • 이 객체에서 메소드를 호출할 시, 기존 객체의 로직을 실행한다.
    • 만약, 스터빙을 한 경우에는 스터빙한 값을 리턴한다.
  • @InjectMocks : @Mock 또는 @Spy로 생성된 객체를 자동으로 주입시켜주는 어노테이션

 

Stubbing 이란?


스텁은 ‘canned answer’로 ‘미리 준비된 답변은 일반적인 질문에 대한 미리 정해진 답변’ 이라는 뜻이다.

즉, stub은 실제 코드가 아직 준비되지 못한 코드를 미리 정해진 답변으로 가장하는 매커니즘이다.

 

Mockito에서 스터빙을 하는 방법

 

Mockito에선 when 메소드를 이용해서 스터빙을 지원하고 있다.

 

  1. OngoingStubbing
    when({스터빙할 메소드}).{OngoingStubbing 메서드};
    
    • thenReturn : 스터빙한 메소드 호출 후 어떤 객체를 리턴할 지 정의
    • thenThrow : 스터빙한 메소드 호출 후 어떤 Exception을 Throw할 건지 정의
    • thenCallRealMethod : 실제 메소드 호출
  2. OngoingStubbing 메소드란 when에 넣은 메소드의 리턴 값을 정의해주는 메소드입니다.
  3. Stubber

 

Stubber 메소드는 OngoingStubbing과는 다르게 when에 스터빙할 클래스를 넣고, 그 후에 메소드를 호출합니다.

이는, 스터빙이 반드시 실행되야 하는 경우 사용하는 메소드이기 때문이다.

 

{Studbber 메서드}.when({스터빙할 클래스}).{스터빙할 메소드}
  • doReturn : 스터빙 메소드 호출 후 어떤 행동을 할 건지 정의
  • doThrow : 스터빙 메소드 호출 후 어떤 Exception을 throw할 건지 정의
  • doAnswer : 스터빙 메소드 호출 후 작업을 할 지 custom하게 정의
  • doNothing : 스터빙 메소드 호출 후 어떤 행동도 하지 않게 정의
  • doCallRealMethod : 실제 메소드 호출

 

  • any는 테스트 코드에서 메서드 호출 시, 인자로 전달되는 값에 대한 일치하는 조건을 지정하는 Mockito 매처 중 하나이다.
  • ‘any’는 매개변수 타입을 받으며, 해당 타입의 모든값을 일치하는 값으로 취급합니다.
    • 예를 들어, any(String.class)는 ‘String’ 타입의 어떤 문자열 값이라도 일치하는 것으로 취급한다.

 

스터빙 메소드 검증


verify 메소드를 이용해서, 스터빙한 메소드가 실행됬는 지 혹은 몇 번 실행됬는 지 등을 검증할 수 있다.

verify(T mock, VerificationMode mode)
  • times(n) : 테스트 내에서 몇 번 호출됬는 지 검증
  • calls(n) : n번이 호출됬는 지 검증 (InOrder랑 같이 사용할 것)

Mockito도 테스팅 프레임워크이기 때문에, JUnit과 결합되기 위해서는 별도의 작업이 필요하다.

 

기존의 JUnit4는 Mockito를 활용하기 위해 클래스 어노테이션으로 @RunWith(MockitoJUnitRunner.class)를 사용했고, SpringBoot 2.2.0 부터 공식적으로 JUnit5를 지원함에 따라, @Extendwith(MockitoExtension.class)를 사용해야 결합이 가능하다.

 

다음으로, Mockito가 지원하고 있는 BDD에 대해서 간단하게 알아보겠습니다.

 

BDD(Behavior Driven Development)란?


BDD(Behavior Driven Development)는 행동을 기준으로 하는 개발 방법론입니다.

 

Mockito에서는 BDD를 지원하기 위해서, BDDMockito 클래스를 제공합니다.

 

또한, 아래와 같은 형식으로 테스트를 작성하면 됩니다.

  • Given : 초기 context 값
  • When : 테스트하려는 조건
  • Then : 테스트 결과

 

지금까지 Mockito에 대해서 공부해보았습니다.

 

모두 열공하세요~~!!

 

728x90