Mockito and JUnit 5 – Using ExtendWith

Dev.Hammy·2024년 4월 1일

Mockito_Tutorial

목록 보기
19/21

1. Overview

이 빠른 튜토리얼에서는 Mockito를 JUnit 5 확장 모델과 통합하는 방법을 보여줍니다. JUnit 5 확장 모델에 대해 자세히 알아보려면 이 기사를 살펴보세요.

먼저, @Mock으로 어노테이션이 달린 클래스 속성이나 메소드 매개변수에 대한 모의 객체를 자동으로 생성하는 확장을 생성하는 방법을 보여드리겠습니다.

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

2. Maven Dependencies

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

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

3. Mockito Extension

Mockito는 라이브러리(mockito-junit-jupiter)에서 JUnit5 확장에 대한 구현을 제공합니다. pom.xml에 이 종속성을 포함하겠습니다.

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

4. Building the Test Class

테스트 클래스를 구축하고 여기에 Mockito 확장을 연결해 보겠습니다.

@ExtendWith(MockitoExtension.class)
class UserServiceUnitTest {

    UserService userService;

    // ...
}

@Mock 어노테이션을 사용하여 테스트 클래스의 어느 곳에서나 사용할 수 있는 인스턴스 변수에 대한 모의 변수를 삽입할 수 있습니다.

@Mock UserRepository userRepository;

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

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

여기서는 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);
    assertNotNull(user.getId());
    verify(mailClient).sendUserRegistrationMail(insertedUser);
}

테스트 매개변수로 주입한 MailClient 모의는 init 메소드에 주입한 인스턴스와 동일하지 않습니다.

0개의 댓글