이 빠른 튜토리얼에서는 Mockito를 JUnit 5 확장 모델과 통합하는 방법을 보여줍니다. JUnit 5 확장 모델에 대해 자세히 알아보려면 이 기사를 살펴보세요.
먼저, @Mock으로 어노테이션이 달린 클래스 속성이나 메소드 매개변수에 대한 모의 객체를 자동으로 생성하는 확장을 생성하는 방법을 보여드리겠습니다.
그런 다음 JUnit 5 테스트 클래스에서 Mockito 확장을 사용하겠습니다.
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>
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>
테스트 클래스를 구축하고 여기에 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 메소드에 주입한 인스턴스와 동일하지 않습니다.