[JUnit & Mockito] Verify Method Calls

원알렉스·2020년 8월 28일
4

JUnit & Mockito

목록 보기
4/9
post-thumbnail

🚀 Verify Method Calls

조금 더 견고하고 정확한 테스트를 진행하기 위해서 가끔은 해당 테스트 안에서 특정 메소드를 호출했는지에 대해서 검증을 할 필요가 있습니다. 이를 위해 Mockito 에서는 verify() 라는 함수를 지원해줍니다.

private List<String> mock = mock(List.class);

@Test
public void verifyMethod_basic() {
    String value = mock.get(0);
    String value2 = mock.get(1);

    verify(mock).get(0);
    verify(mock, times(2)).get(anyInt());
    verify(mock, atLeast(1)).get(anyInt());
    verify(mock, atLeastOnce()).get(anyInt());
    verify(mock, atMost(2)).get(anyInt());
    verify(mock, never()).get(2);
}
  • verify(mock).method(param);

    • 해당 Mock Object 의 메소드를 호출했는지 검증
  • verify(mock, times(wantedNumberOfInvocations)).method(param);

    • 해당 Mock Object 의 메소드가 정해진 횟수만큼 호출됬는지 검증
  • verify(mock, atLeast(minNumberOfInvocations)).method(param);

    • 해당 Mock Object 의 메소드가 최소 정해진 횟수만큼 호출됬는지 검증
  • verify(mock, atLeastOnce()).method(param);

    • 해당 Mock Object 의 메소드가 최소 한번 호출됬는지 검증
  • verify(mock, atMost(maxNumberOfInvocations)).method(param);

    • 해당 Mock Object 의 메소드가 정해진 횟수보다 적게 호출됬는지 검증
  • verify(mock, never()).method(param);

    • 해당 Mock Object 의 메소드가 호출이 안됬는지 검증

✓ Argument Capture

필요에 따라서 가끔은 검증이 필요한 메소드에 전달된 값까지 확인할 필요가 있습니다. 이럴 때에는 Mockito의 ArgumentCaptor 클래스를 사용하면 됩니다.

@Test
public void argumentCapture() {
    mock.add("Test String");

    // Argument Capture Verification
    ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
    verify(mock).add(captor.capture());

    assertEquals("Test String", captor.getValue());
}

Multiple Argument Capture

만약 여러 파라미터 값들을 검증할 필요가 있을 때에는, getAllValues() 함수를 사용하면 됩니다.

@Test
public void argumentCapture() {
    mock.add("Test String 1");
    mock.add("Test String 2");

    // Argument Capture Verification
    ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
    verify(mock, times(2)).add(captor.capture());

    List<String> allValues = captor.getAllValues();
    assertEquals("Test String 1", allValues.get(0));
    assertEquals("Test String 2", allValues.get(1));
}
profile
Alex's Develog 🤔

0개의 댓글