조금 더 견고하고 정확한 테스트를 진행하기 위해서 가끔은 해당 테스트 안에서 특정 메소드를 호출했는지에 대해서 검증을 할 필요가 있습니다. 이를 위해 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);
verify(mock, times(wantedNumberOfInvocations)).method(param);
verify(mock, atLeast(minNumberOfInvocations)).method(param);
verify(mock, atLeastOnce()).method(param);
verify(mock, atMost(maxNumberOfInvocations)).method(param);
verify(mock, never()).method(param);
필요에 따라서 가끔은 검증이 필요한 메소드에 전달된 값까지 확인할 필요가 있습니다. 이럴 때에는 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));
}