1. 개요

이 빠른 사용방법(예제)에서는 Mockito를 JUnit 5 확장 모델과 통합하는 방법을 보여 줍니다. JUnit 5 확장 모델에 대해 자세히 알아보려면 이  기사를 참조하십시오 .

먼저 @Mock 어노테이션이 달린 모든 클래스 속성 또는 메서드 매개변수에 대해 모의 객체를 자동으로 생성하는 확장을 만드는 방법을 보여줍니다  .

그런 다음 JUnit 5 테스트 클래스에서 Mockito 확장을 사용합니다.

2. 메이븐 의존성

2.1. 필수 의존성

JUnit 5(jupiter) 및  mockito  의존성을  pom.xml에 추가해 보겠습니다 .

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.3.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>2.21.0</version>
    <scope>test</scope>
</dependency>

주의  의 JUnit - 목성 - 엔진이  주 JUnit을 5 라이브러리이며,  JUnit을-플랫폼 실행이  메이븐 플러그인 및 IDE 실행에 사용됩니다.

2.2. 확실한 플러그인

또한 새로운 JUnit 플랫폼 실행기를 사용하여 테스트 클래스를 실행하도록 Maven Surefire 플러그인을 구성해 보겠습니다.

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <dependencies>
        <dependency>
             <groupId>org.junit.platform</groupId>
             <artifactId>junit-platform-surefire-provider</artifactId>
             <version>1.0.1</version>
         </dependency>
     </dependencies>
</plugin>

2.3. JUnit 4 IDE 호환성 의존성

테스트 케이스가 JUnit4(빈티지)와 호환되도록 하려면 아직 JUnit 5를 지원하지 않는 IDE의 경우 다음 의존성을 포함시키겠습니다.

<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-runner</artifactId>
    <version>1.2.0</version>
    <scope>test</scope>
</dependency>
<dependency>
     <groupId>org.junit.vintage</groupId>
     <artifactId>junit-vintage-engine</artifactId>
     <version>5.2.0</version>
     <scope>test</scope>
</dependency>

또한 모든 테스트 클래스에 @RunWith(JUnitPlatform.class) 어노테이션을 추가하는 것을 고려해야  합니다.

최신 버전의  junit-jupiter-enginejunit-vintage-enginejunit-platform-launcher  및  mockito-core  는 Maven Central에서 다운로드할 수 있습니다.

3. Mockito 확장

Mockito 는 라이브러리의 JUnit5 확장에 대한 구현을 제공합니다 — mockito-junit-jupiter .

pom.xml에 이 의존성을 포함할 것입니다 .

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>2.23.0</version>
    <scope>test</scope>
</dependency>

4. 테스트 클래스 구축

테스트 클래스를 빌드하고 Mockito 확장을 추가해 보겠습니다.

@ExtendWith(MockitoExtension.class)
@RunWith(JUnitPlatform.class)
public class UserServiceUnitTest {

    UserService userService;

... //
}

우리는 사용할 수  @Mock의  우리가 테스트 클래스 어디서나 사용할 수있는 인스턴스 변수에 대한 모의를 주입 어노테이션 :

@Mock UserRepository userRepository;

또한 모의 객체를 메소드 매개변수에 주입할 수 있습니다.

@BeforeEach
void init(@Mock SettingRepository settingRepository) {
    userService = new DefaultUserService(userRepository, settingRepository, mailClient);
      
    Mockito.lenient().when(settingRepository.getUserMinAge()).thenReturn(10);
        
    when(settingRepository.getUserNameMinLength()).thenReturn(4);
        
    Mockito.lenient()
        .when(userRepository.isUsernameAlreadyExists(any(String.class)))
            .thenReturn(false);
}

여기 에서 Mockito.lenient() 사용에 유의 하십시오. Mockito초기화된 모의가 실행 중에 테스트 메소드 중 하나에 의해 호출 되지 않을 때 UnsupportedStubbingException을 던집니다 . 모의 객체를 초기화할 때 이 방법을 사용하면 이 엄격한 스텁 검사를 피할 수 있습니다.

테스트 메소드 매개변수에 모의 객체를 주입할 수도 있습니다.

@Test
void givenValidUser_whenSaveUser_thenSucceed(@Mock MailClient mailClient) {
    // Given
    user = new User("Jerry", 12);
    when(userRepository.insert(any(User.class))).then(new Answer<User>() {
        int sequence = 1;
            
        @Override
        public User answer(InvocationOnMock invocation) throws Throwable {
            User user = (User) invocation.getArgument(0);
            user.setId(sequence++);
            return user;
        }
    });

    userService = new DefaultUserService(userRepository, settingRepository, mailClient);

    // When
    User insertedUser = userService.register(user);
        
    // Then
    verify(userRepository).insert(user);
    Assertions.assertNotNull(user.getId());
    verify(mailClient).sendUserRegistrationMail(insertedUser);
}

테스트 매개변수로 주입 하는 MailClient 모의는 init 메소드 에서 주입한 것과 동일한 인스턴스가 아닙니다 .

5. 결론

Junit 5는 확장을 위한 멋진 모델을 제공했습니다. 우리는 모의 생성 로직을 단순화하는 간단한 Mockito 확장을 시연했습니다.

이 기사에 사용된 모든 코드 는 몇 가지 추가 단위 테스트 방법과 함께 GitHub 프로젝트com.baeldung.junit5.mockito  패키지  에서 찾을 수 있습니다  .

Junit footer banner