본문 바로가기
Today I Learned 2024. 6. 19.

(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 정규식에 부합하는 값을 매칭