Today I Learned
(24.06.19)[10주차] Mockito 구문
개인 과제를 진행하면서 JUnit 5 과 Mockito를 사용하여 테스트 코드를 진행을 했다.
하지만, Mock 객체를 만드는 것은 잘 확인할 수 있었지만,
Mock객체를 검증하는데 필요한 구문들을 활용하느데 있어서, 일상 영어 같지만, 특정 규칙이 있으며, 그것을 활용한다면 테스트 코드가 더 다양하게 확장시킬 수 있음을 알 수 있었다.
추가적으로 학습을 하기 위해서 Mockito 구문들 그리고 구문에 사용할 수 있는 ArgumentMatcher에 대해선 찾아보고
내 말로 정리를 했다.
Mockito 구문
Mockito에서 알고 있었던 것
@ExtendWith(MockitoExtension.class)
...
@Mock
ProductRepository productRepository;
...
- Mockito는 가짜객체를 생성하여 테스트코드에서 사용할 수 있는 Java에서 사용할 수 있는 일종의 외부 라이브러리
- Gradle 등에 빌드 도구를 등록해서 사용할 수 있도록 함(Spring Boot)
- @ExtendWith(MockitoExtension.class) 외부 라이브러리 역할이므로 @Mock을 사용할 수 있도록 사용크래스에다가 Annotation을 사용할 수 있어야
- JUnit 5을 통해서 확장기능으로 지정을 해야하는 것
- @Mock Annotation을 사용해서 해당 객체의 Mock을 사용할 수도 있음
-> 그러면 Mock으로 만든 객체를 더 다양하게 사용할 수 있느 방법으로 구문과 Mock 객체 생성을 할 수 있을것
Mockito객체를 직접적인 생성
...
UserRepository mockRepository = mock(UserRepository.class);
...
- mock(mock으로 만들 대상 객체 클래스(클래스리터럴))
- 직접적으로 해당 객체를 Mock 객체로 만들어주는 매서드, 반환타입은 당연히 해당 객체 타입으로 지정을 해줘야함
- @Mock을 지정하지 않아도 직접적으로 만들어서 사용해야함
-> 그러면 given().willReturn 구문말고는 어떻게 상요할 수 있을까
Mockito객체를 사용하기 위한 체이닝 구문
- 체이닝 구문들은 다양하게 합쳐서 일종의 문장처럼 만들어서 사용이 가능
when()
- Mock객체의 메서드 호출을 가로채는 역할
thenReturn(반환 값)
- when과 대체로 함께 뒤에 사용되며, when을 통한 Mock개체의 메서드 호출시, 반환할 값들을 설정
doReturn(), doThrow(), doNothing()
doReturn(expectedResult).when(mockObject).someMethod();
doThrow(new RuntimeException()).when(mockObject).methodThatThrows();
doNothing().when(mockObject).voidMethod();
- when과 대체로 함께 앞에 사용되며, when을 통한 Mock개체의 메서드 중에서 void 반환 메서드, 예외를 발생할 경우에 대해서 설정 가능함
given()
- Mock객체의 메서드 호출을 가로챈 다음에 어떻게 동작할지의 역할로 Mockito.when() 을 대신 할 수 있음
willReturn(반환 값)
- given()과 대체로 함께 사용되며, given을 통한 Mock개체의 메서드 호출시, 반환할 값들을 설정
- Mockito가 최신 버전일 수록 thenReturn 과 혼용해서 사용가능
verify(mock객체, times(횟수).(mock객체메서드))
@Test
public void testUserService() {
// Mock 객체 생성
UserRepository mockRepository = mock(UserRepository.class);
// Service 클래스에 Mock 객체 주입
UserService userService = new UserService(mockRepository);
// 서비스 메서드 호출
userService.findUserById(1L);
// 검증: findById 메서드가 한 번 호출되었는지 확인
verify(mockRepository, times(1)).findById(1L);
}
...
- 해당 Mock객체의 특정 메서드 호출 발생 예상 횟수가 입력 횟수와 일치하는지 검증
- 검증 성공 시, 아무 반응X
- 검증 실패 시, 테스트 실패로 간주
- assert 문과 같이 Mock객체에 대한 검증이 필요할 때 사용가능
reset()
- Mock객체를 다시 초기화 할 필요가 있을 떄 사용
ArgumentMatchers
@Test
public void testUserService() {
// Mock 객체 생성
UserRepository mockRepository = mock(UserRepository.class);
// ArgumentMatchers를 사용하여 매개변수를 매칭
when(mockRepository.findById(anyLong())).thenReturn(new User(1L, "Test User"));
...
- Mockito에서 Mock객체의 메서드의 변수, 인자를 매칭하는데 유연하게 사용할 수 있는 클래스
- 특정 값을 변수로 주지 않아도 ArgumentMatchers 클래스내 any()등을 사용
- 호출에 전달되는 변수들을 세부적으로 검증이 가능한 장점을 가지고 있음
any()
- 모든 타입이 와도 상관 없이 매칭
- () 안에 String.class 등 특정 타입에 관한 값에 대해서 매칭을 시킬 수 있음
anyString(), anyInt(), anyLong(), anyDouble(), anyBoolean()
- any 뒤에 오는 해당 타입만 매칭
eq(해당 값)
- 정확한 일치하는 값을 매칭
matches(String regex)
- 값이 문자열 String일때 regex 정규식에 부합하는 값을 매칭
'Today I Learned' 카테고리의 다른 글
(24.06.21)[10주차] CrudRepository & Delete 쿼리 메서드 (0) | 2024.06.21 |
---|---|
(24.06.20)[10주차] Optional 객체값 가져오기 (0) | 2024.06.20 |
(24.06.18)[10주차] Reflection & ReflectionTestUtils을 통한 필드 다루기 (0) | 2024.06.18 |
(24.06.17)[10주차] Validator 객체 생성과 테스트 코드에서의 활용 (0) | 2024.06.17 |
(24.06.14)[9주차] Servlet 객체 활용하기 (0) | 2024.06.14 |