Mockito는 함수 호출을 유연하게 분리하거나 확인하기 위해 인수 일치자와 인수 저장자(argument captor)를 제공합니다.
각 Mockito.verify(), Mockito.when(), Stubber.when(), BDDMockito.given() 함수는 인수 일치자와 관계 없이 오버로딩할 수 있습니다.
하지만 만약 인수 일치자 또는 저장자가 오직 몇 개의 매개 변수를 사용한다면, 모든 매개 변수는 일치자를 가져야 합니다. 그렇지 않으면 InvalidUseOfMatchersException 예외가 발생합니다.
이 규칙은 결과적으로 stubbed/verified 된 메서드의 일부 매개 변수에 대해 일치자가 사용되지 않을 때마다 문제를 제기합니다.
규칙을 어긴 코드
@Test
public void myTest() {
given(foo.bar(anyInt(), i1, i2)).willReturn(null); // 규칙을 어긴 코드
when(foo.baz(eq(val1), val2)).thenReturn("hi"); // 규칙을 어긴 코드
doThrow(new RuntimeException()).when(foo).quux(intThat(x -> x >= 42), -1); // 규칙을 어긴 코드
verify(foo).bar(i1, anyInt(), i2); // 규칙을 어긴 코드
ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class);
verify(foo).bar(captor.capture(), i1, any()); // 규칙을 어긴 코드
}
규칙을 준수한 코드
@Test
public void myTest() {
given(foo.bar(anyInt(), eq(i1), eq(i2))).willReturn(null);
when(foo.baz(val1, val2)).thenReturn("hi");
doThrow(new RuntimeException()).when(foo).quux(intThat(x -> x >= 42), eq(-1));
verify(foo).bar(eq(i1), anyInt(), eq(i2));
ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class);
verify(foo).bar(captor.capture(), any(), any());
}
참고
- Mockito documentation - argument matchers
- {rule:java:S6068} - Mockito 함수인 “verify”, “when”, “given”을 호출하는 것은 간소화되어야 합니다.
If you like SONARKUBE, don’t forget to give me a star.