JUnit과 Mockito 기반의 Spring 단위 테스트

이은수·2023년 6월 4일

1. Mockito란?

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

  • 일반적으로 Spring과 같은 웹 어플리케이션을 개발한다고 하면, 여러 객체들 간의 의존성이 존재한다.

  • 이러한 의존성은 단위 테스트를 작성하는 것을 어렵게 하는데, 이를 해결하기 위해 가짜 객체를 주입
    시켜주는 Mockito 라이브러리를 활용할 수 있다.

  • Mockito를 활용함으로써 가짜 객체에 원하는 결과를 Stub하여 단위 테스트를 진행할 수 있다.

Stub: "A stub is a short article in need of expansion" 직역하면 "스텁은 확장이 필요한 짧은 기사"이다. 아직 다 작성되지 않은 기사나 제목만 있는 기사처럼 함수 이름만 있거나 내용이 완전치 않은 코드를 뜻한다. 테스팅에서 사용되는 테스트 스텁(Test stub)은 테스트를 위하여 작성된 코드로 특정한 목적을 위해 사용된다.

2. Mockito 사용

Mock 객체 의존성 주입

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

  • @Mock: Mock 객체를 만들어 반환해주는 어노테이션

  • @Spy: Stub하지 않은 메서드들은 원본 메서드 그대로 사용하는 어노테이션

  • @InjectMocks: @Mock 또는 @Spy로 생성된 가짜 객체를 자동으로 주입시켜주는 어노테이션

예를 들어 UserController에 대한 단위 테스트를 작성하고자 할때, UserService를 주입받고 있다면 @Mock 어노테이션을 통해 가짜 UserService를 만들고, @InjectMocks를 통해 UserController에 주입시킬수있다.

Stub

  • 의존성이 있는 객체는 가짜 객체(Mock Object)를 주입하여 어떤 결과를 반환하라고 정해진 답변을 준비시켜야 한다. Mockito에서는 다음과 같은 stub 메서드를 제공한다.

    • doReturn(): Mock 객체가 특정한 값을 반환해야 하는 경우

    • doNothing(): Mock 객체가 아무것도 반환하지 않는 경우

    • doThrow(): Mock 객체가 예외를 발생시키는 경우

예를 들어 UserService의 findAllUser()호출 시에 빈 ArrayList를 반환해야 한다면 다음과 같이 doReturn()을 사용할수있다.

doReturn(new ArrayList()).when(userService).findAllUser()

Mockito와 Junit의 결합

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

  • 기존의 JUnit4에서 Mockito를 활용하기 위해서는 클래스 어노테이션으로 @RunWith(MockitoJUnitRunner.class)를 붙여 주어야 연동이 가능하다.

  • 하지만 SpringBoot 2.2.0 부터 공식적으로 JUnit5를 지원함에 따라, 이제부터는 @ExpendWith(MockitoExtension.class)를 사용해야 결합이 가능하다

0개의 댓글