Mockito 인수 일치자(argument matchers)는 모든 파라미터가 사용되어야 합니다.

 

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. :star2:

원문으로 바로가기

Star This Project