Spring & Spring boot

[Springboot] 테스트 코드 - 5 - Mockito

jh4dev 2024. 8. 6. 16:10
<목차>

1. Mockito ?
2. Mockito 특징

 

[Mockito ?]

Mockito 는 JAVA 에서 사용하는 Mock Framework 이다.

흔히 Mockup 에서 사용하는 Mock 과 동일한 의미로, 주로 단위 테스트 작성 시 사용되며, 의존성 주입(DI)나 테스트 환경에서의 객체를 가짜로 생성하고 테스트 과정에서 맡을 동작을 정의하여, 실제 구현 없이 테스트를 수행할 수 있도록 도와준다.

단, 단위 테스트 이후 단계에서 사용하는 것은 무의미한 부분이 있다.

 

Mockito 의 주요 기능은 다음과 같다.

  • 모의 객체 생성
    • 테스트에서 사용할 객체를 가짜로 생성할 수 있다.
    • 테스트 중, 의존하는 객체를 실제 구현 대신 Mock 객체로 대체하여 테스트 대상 코드와 모의 객체 간의 상호작용을 검증한다.
  • 메서드 호출 설정 (Stubbing)
    • 모의 객체의 메서드가 호출되었을 때, 리턴될 값을 설정할 수 있다.
    • given() 메서드를 사용하여, 특정 메서드 호출 시 리턴될 값을 설정함으로써 테스트의 독립성과 재현성을 보장한다.
  • 메서드 호출 검증
    • 특정 메서드가 호출되었는지 여부와 호출 횟수를 검증할 수 있다.
    • verify() 메서드를 통해 특정 메서드가 호출되었는지와 호출 횟수 등을 검증하여, 테스트가 기대하는 동작을 수행했는지 확인할 수 있다.
  • 예외 처리
    • 특정 메서드 호출 시, 예외를 던지도록 설정할 수 있다.

[Mockito 특징]

Mockito 를 활용함으로서 단위 테스트에서 아래와 같은 이점을 얻을 수 있다.

  • 테스트 독립성 보장
    • Mock 객체를 활용함으로써, 실제 의존성과 무관하게 단위 테스트를 수행할 수 있어 테스트의 신뢰성을 높인다.
  • 비즈니스 로직 검증
    • 비즈니스 로직이 올바르게 동작하는지 검증
  • 재현성
    • 동일한 테스트 환경을 유지할 수 있으므로, 일관된 결과를 제공한다.
  • 유연성
    • 다양한 시나리오를 쉽게 테스트 할 수 있으며, 특정 메서드 호출의 반환값이나 예뢰를 설정할 수 있다.

 

<Mockito 의 주요 메서드>

  • mock()
    • 모의 객체를 생성하는 메서드
	List<String> mockList = mock(List.class);

 

  • when() /  given()
    • 모의 객체의 메서드 호출 시 반환할 값을 설정한다.
    /*
    * when()
    * Mockito의 기본 스타일로, 메서드 호출을 모킹할 때 사용
    */
    when(mockObject.someMethod()).thenReturn(someValue);

    /*
    * BDD(행동 주도 개발) 스타일로 테스트 코드 작성 시 사용된다.
    * 메서드의 역할 자체는 when() 과 동일하나 Given-When-Then 패턴과 일치시켜 가독성을 높인다.
    */
    given(mockObject.someMethod()).willReturn(someValue);

 

  • verify()
    • 모의 객체의 메서드가 특정한 호출 패턴을 따랐는지 확인한다.
	verify(mockList).get(0);

 

  • doThrow()
    • 모의 객체의 메서드 호출 시, 예외를 Throw 하도록 설정한다.

	doThrow(new RuntimeException("Test exception")).when(mockList).get(1);
  • spy()
    • 실제 객체의 일부 메서드만 모의할 수 있는 스파이 객체를 생성한다.
    List<String> realList = new ArrayList<>();
    List<String> spyList = spy(realList);
    when(spyList.size()).thenReturn(10); //spyList.size() 는 0 이지만, 10 이 리턴되도록 설정한다.

 

 

다음 포스팅에서는, 스프링 부트 환경에서 JUnit, Assertion, Mockito 등을 활용하여
컨트롤러 / 서비스 / 리포지토리 의 단위 테스트 코드 작성 방법에 대해 알아보자.