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-engine , junit-vintage-engine , junit-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 패키지 에서 찾을 수 있습니다 .