ysk(0soo)
Lifealong
ysk(0soo)
전체 방문자
오늘
어제
  • 분류 전체보기 (238)
    • Java (50)
      • whiteship-java-study (11)
      • Java (28)
      • time (6)
    • Spring (68)
      • JPA (15)
      • Spring (1)
      • SpringBoot (1)
      • SpringMVC (6)
      • Spring Security (22)
      • Jdbc (1)
      • RestDocs (14)
      • log (6)
    • Kotlin (3)
    • Web (2)
      • nginx (1)
    • Database (14)
      • MySQL (5)
      • PostgreSQL (1)
      • SQL (1)
      • Redis (4)
    • C, C++ (0)
    • Git (1)
    • Docker (2)
    • Cloud (3)
      • AWS (3)
    • 도서, 강의 (0)
      • t5 (0)
    • 기타 (7)
      • 프로그래밍 (1)
    • 끄적끄적 (0)
    • CS (14)
      • 운영체제(OS) (2)
      • 자료구조(Data Structure) (9)
    • 하루한개 (12)
      • 우아한 테크코스-10분테코톡 (12)
    • 스터디 (12)
      • 클린 아키텍처- 로버트마틴 (2)
      • JPA 프로그래밍 스터디 (10)
    • 테스트 (34)
      • JUnit (19)
      • nGrinder (2)
      • JMeter (0)
    • Infra (3)
    • 프로그래머스 백엔드 데브코스 3기 (0)
    • 디자인 패턴 (3)
    • Issue (4)
    • system (1)
      • grafana (0)
      • Prometheus (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

공지사항

인기 글

태그

  • UserDetailsService
  • 가상 스레드
  • 정규표현식
  • 동일성
  • AccessDecisionManager
  • FilterSecurityInterceptor
  • jpa
  • 가상 스레드 예외 핸들링
  • nGrinder
  • restdocs custom
  • node exporter basic auth
  • DataJpaTest
  • 트랜잭션
  • 구조화된 동시성
  • restdocs enum
  • 동등성
  • 동시성 제어
  • AccessDecisionVoter 커스텀
  • junit5
  • java
  • AuthenticationException
  • StructuredConcorrency
  • querydsl
  • tree
  • LocalDateTime
  • 인가(Authorization) 처리
  • scope value
  • mysql
  • VirtualThread Springboot
  • nginx basic auth

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ysk(0soo)

Lifealong

테스트/JUnit

Mockito Verify, Mock Object 검증, 호출 횟수 검증

2023. 1. 25. 00:33

Mockito Verify 메소드는 특정 동작이 발생했는지 확인하는 데 사용된다. mocking한 메서드가 호출되었는지 확인하기 위해 테스트 메서드 코드 끝에 Mockito 검증 메서드를 사용할 수 있다.

  • https://github.com/WebJournal/journaldev/tree/master/Mockito-Examples 에 더 많은 예제가 있다.

Mockito 검증

  • Mockito verify() 메서드를 사용하여 메서드 호출 수 (call count)를 테스트할 수도 있다.
    • mock 메서드에 대해 정확한 횟수, 적어도 한 번, 최대 호출 횟수를 테스트할 수 있다.
  • verifyNoMoreInteractions() : 모든 verify() 메서드 호출 후에 모든 것이 확인되었는지 확인할 수 있다 . 메서드 확인이 아직 남아 있으면 실패하고 적절한 메시지를 제공한다.
  • verifyZeroInteractions() 는 verifyNoMoreInteractions()방법과 동일하다.
  • inOrder()메서드를 사용하여 메서드 호출 순서를 확인할 수 있다 . 메서드 호출을 건너뛸 수 있지만 확인 중인 메서드의 순서는 동일해야 한다.

mockito 검증 방법 예제 중 일부이다.

Mockito verify() 간단한 예제

@Test
void test() {
    List<String> mockList = mock(List.class);
    mockList.add("ys");
    mockList.size();

    verify(mockList).add("ys");
}

위 의 verify 메서드 (add("ys")) 는 mock 객체에서 한 번만 호출 되면 통과 한다.

  • 반면 호출되지 않으면 예외가 발생한다.

아래의 times(1) verify 메서드 로 인수를 호출하는 것과 같다 .

verify(mockList, times(1)).size();

메서드가 호출되었는지 확인하고 싶지만 인수에 대해 신경쓰지 않는 경우 ArgumentMatchers를 verify 메서드와 함께 사용할 수 있다.

verify(mockList).add(anyString());
verify(mockList).add(any(String.class));
verify(mockList).add(ArgumentMatchers.any(String.class));

org.mockito.Mockito클래스는 Mockito 프레임워크의 유용한 메서드 대부분에 대한 static 메서드를 제공한다.

횟수로 Mockito 검증(Verify )

Mockito verify() 메서드가 오버로드 되고 두 번째는 verify(T mock, VerificationMode mode). 호출 횟수를 확인하는 데 사용할 수 있다.

verify(mockList, times(1)).size(); // 일반 확인 방법( times () 생략) 과 동일
verify(mockList, atLeastOnce()).size(); // 무조건 1번 이상 호출해야한다. 
verify(mockList, atMost(2)).size(); // 최대 2번 호출 해야 한다
verify(mockList, atLeast(1)).size(); // 한 번 이상 호출해야 한다. 
verify(mockList, never()).clear(); // 절대 호출하면 안된다. 

verifyNoMoreInteractions()

이 메서드는 호출 (인터렉션, 상호작용)이 확인되었는지 확인하기 위해 모든 verify 메서드 후에 사용할 수 있다.
mock 객체에 확인되지 않은 호출 (인터렉션, 상호작용) 이 있으면 테스트에 실패합니다.

// 모든 상호 작용이 확인되었으므로 아래는 통과 
verifyNoMoreInteractions(mockList);
mockList.isEmpty();
// isEmpty()가 확인되지 않았으므로 아래에서 실패
verifyNoMoreInteractions(mockList);

verifyNoMoreInteractions()의 두 번째 호출은 다음과 같은 오류 메시지와 함께 실패한다. .

org.mockito.exceptions.verification.NoInteractionsWanted: 
No interactions wanted here:
-> at com.journaldev.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:36)
But found this interaction on mock 'list':
-> at com.journaldev.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:34)
***
For your reference, here is the list of all invocations ([?] - means unverified).
1. -> at com.journaldev.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:18)
2. -> at com.journaldev.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:19)
3. [?]-> at com.journaldev.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:34)

Mockito의 뛰어난 기능 중 하나는 예외 메시지이다. 테스트가 실패한 부분을 명확하게 지적하여 쉽게 수정할 수 있다.

verifyZeroInteractions()

verifyZeroInteractions()메서드 동작은 verifyNoMoreInteractions() 메서드와 동일하다.

Map mockMap = mock(Map.class);
Set mockSet = mock(Set.class);
verify(mockList).isEmpty();
verifyZeroInteractions(mockList, mockMap, mockSet);

Mockito 검증 전용 메서드 호출

하나의 메서드만 호출 되는지 확인하려면 only()verify 메서드와 함께 사용할 수 있다.

Map mockMap = mock(Map.class);
mockMap.isEmpty();
verify(mockMap, only()).isEmpty();

Mockito 호출 순서 확인

InOrder호출 순서를 확인하는 데 사용할 수 있다 . 확인을 위해 모든 메서드를 건너뛸 수 있지만 확인 중인 메서드는 동일한 순서로 호출되어야 한다.

InOrder inOrder = inOrder(mockList, mockMap);
inOrder.verify(mockList).add("Pankaj");
inOrder.verify(mockList, calls(1)).size();
inOrder.verify(mockList).isEmpty();
inOrder.verify(mockMap).isEmpty();

요약

Mockito verify() 메서드를 사용하여 모의 개체 메서드가 호출되고 있는지 확인할 수 있다.
메서드 호출이 실수로 삭제된 경우 verify 메서드에서 오류가 발생한다.

참조

  • https://github.com/WebJournal/journaldev/tree/master/Mockito-Examples
  • https://www.digitalocean.com/community/tutorials/mockito-verify
저작자표시 비영리 (새창열림)

'테스트 > JUnit' 카테고리의 다른 글

Java Collection, List, Array 비교, 검증  (0) 2023.01.25
@WebMvcTest Security 401 403 응답 해결방법 - csrf  (0) 2023.01.25
MockMvc 테스트시 201 created URI를 검증하는 방법  (0) 2023.01.24
MockMvc 테스트 body가 '<no character encoding set>' 인경우  (0) 2023.01.24
JUnit5 생성자 주입 방법과 원리  (0) 2022.12.16
    '테스트/JUnit' 카테고리의 다른 글
    • Java Collection, List, Array 비교, 검증
    • @WebMvcTest Security 401 403 응답 해결방법 - csrf
    • MockMvc 테스트시 201 created URI를 검증하는 방법
    • MockMvc 테스트 body가 '<no character encoding set>' 인경우
    ysk(0soo)
    ysk(0soo)
    백엔드 개발을 좋아합니다. java kotlin spring, infra 에 관심이 많습니다. email : kim206gh@naver.com github : https://github.com/devysk

    티스토리툴바