[Java] Mockito에서 varargs를 올바르게 일치시키는 법


Answers

다소 문서화되지 않은 기능 : vararg 인수와 일치하는 사용자 지정 Matcher를 개발하려면 제대로 작동하려면 org.mockito.internal.matchers.VarargMatcher 를 구현해야합니다. Matcher를 사용하여 varargs 메서드를 호출 할 때 Mockito가 인수를 올바르게 비교하지 못하는 빈 마커 인터페이스입니다.

예 :

class MyVarargMatcher extends ArgumentMatcher<C[]> implements VarargMatcher {
    @Override public boolean matches(Object varargArgument) {
        return /* does it match? */ true;
    }
}

when(a.b(anyInt(), anyInt(), argThat(new MyVarargMatcher()))).thenReturn(b);
Question

나는 Mockito를 사용하여 vararg 매개 변수로 메소드를 조롱하려고 노력했다.

interface A {
  B b(int x, int y, C... c);
}

A a = mock(A.class);
B b = mock(B.class);

when(a.b(anyInt(), anyInt(), any(C[].class))).thenReturn(b);
assertEquals(b, a.b(1, 2));

그러나 이렇게하면 대신 작동하지 않습니다.

when(a.b(anyInt(), anyInt())).thenReturn(b);
assertEquals(b, a.b(1, 2));

이것에도 불구하고, 메소드를 스터 빙할 때 varargs 인수를 완전히 생략했습니다.

모든 단서?




내 경우에는 그 인수를 캡처하려는 메서드의 서명은 다음과 같습니다.

    public byte[] write(byte ... data) throws IOException;

이 경우 명시 적으로 바이트 배열로 캐스트해야합니다.

       when(spi.write((byte[])anyVararg())).thenReturn(someValue);

나는 mockito 버전 1.10.19




나는 Peter Westmacott의 답변에서 Mockito 2.2.15를 사용하여 코드를 사용했지만 다음과 같은 작업을 수행 할 수 있습니다.

verify(a).method(100L, arg1, arg2, arg3)

여기서 arg1, arg2, arg3 은 varargs입니다.