Mockito에서 Varargs를 올바르게 일치시키는 방법
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 인수를 완전히 생략 했음에도 불구하고 작동합니다.
단서가 있습니까?
Mockito 1.8.1은 anyVararg () 매처를 도입 했습니다 .
when(a.b(anyInt(), anyInt(), Matchers.<String>anyVararg())).thenReturn(b);
https://code.google.com/archive/p/mockito/issues/62에 대한 기록도 참조하십시오.
더 이상 사용되지 않는 새 구문을 편집하십시오 .
when(a.b(anyInt(), anyInt(), ArgumentMatchers.<String>any())).thenReturn(b);
다소 문서화되지 않은 기능 : vararg 인수와 일치하는 사용자 정의 Matcher를 개발 org.mockito.internal.matchers.VarargMatcher
하려면 올바르게 작동하도록 구현해야 합니다. Mockito가 Matcher를 사용하여 varargs로 메소드를 호출 할 때 인수를 올바르게 비교하지 않는 빈 마커 인터페이스입니다.
예를 들면 다음과 같습니다.
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);
여기에 Eli Levine의 대답을 바탕으로보다 일반적인 해결책이 있습니다.
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.mockito.ArgumentMatcher;
import org.mockito.internal.matchers.VarargMatcher;
import static org.mockito.Matchers.argThat;
public class VarArgMatcher<T> extends ArgumentMatcher<T[]> implements VarargMatcher {
public static <T> T[] varArgThat(Matcher<T[]> hamcrestMatcher) {
argThat(new VarArgMatcher(hamcrestMatcher));
return null;
}
private final Matcher<T[]> hamcrestMatcher;
private VarArgMatcher(Matcher<T[]> hamcrestMatcher) {
this.hamcrestMatcher = hamcrestMatcher;
}
@Override
public boolean matches(Object o) {
return hamcrestMatcher.matches(o);
}
@Override
public void describeTo(Description description) {
description.appendText("has varargs: ").appendDescriptionOf(hamcrestMatcher);
}
}
그런 다음 hamcrest의 배열 매처와 함께 사용할 수 있습니다.
verify(a).b(VarArgMatcher.varArgThat(
org.hamcrest.collection.IsArrayContaining.hasItemInArray("Test")));
(정적으로 임포트하면 이것을 더 읽기 쉽게 만듭니다.)
Peter Westmacott의 답변에서 코드를 사용했지만 Mockito 2.2.15에서는 다음을 수행 할 수 있습니다.
verify(a).method(100L, arg1, arg2, arg3)
arg1, arg2, arg3
varargs는 어디에 있습니까 ?
topchef의 답변을 바탕으로
2.0.31-beta의 경우 Matchers.anyVararrg 대신 Mockito.anyVararg를 사용해야했습니다.
when(a.b(anyInt(), anyInt(), Mockito.<String>anyVararg())).thenReturn(b);
필자의 경우 인수를 캡처하려는 메소드의 서명은 다음과 같습니다.
public byte[] write(byte ... data) throws IOException;
이 경우 명시 적으로 바이트 배열로 캐스트해야합니다 .
when(spi.write((byte[])anyVararg())).thenReturn(someValue);
mockito 버전을 사용하고 있습니다 1.10.19
인수를 반복 할 수도 있습니다.
Object[] args = invocation.getArguments();
for( int argNo = 0; argNo < args.length; ++argNo) {
// ... do something with args[argNo]
}
예를 들어, 유형을 확인하고 적절하게 캐스팅하고 목록에 추가하십시오.
@topchef의 답변을 채택하여
Mockito.when(a.b(Mockito.anyInt(), Mockito.anyInt(), Mockito.any())).thenReturn(b);
Per the java docs for Mockito 2.23.4, Mockito.any() "Matches anything, including nulls and varargs."
You can accomplish this by passing an ArgumentCaptor capture and then retrieving the varargs as a list using "getAllValues", see: https://stackoverflow.com/a/55621731/11342928
참고URL : https://stackoverflow.com/questions/2631596/how-to-properly-match-varargs-in-mockito
'Programming' 카테고리의 다른 글
C에서 실행 파일의 위치를 어떻게 찾습니까? (0) | 2020.06.20 |
---|---|
Golang에서 문자열을 분할하여 변수에 할당하는 방법은 무엇입니까? (0) | 2020.06.20 |
Java의 toString과 동등한 C ++? (0) | 2020.06.20 |
Rust에서 문자열 리터럴과 문자열을 일치시키는 방법은 무엇입니까? (0) | 2020.06.19 |
Android : 활동 수명주기 중에 언제 onCreateOptionsMenu가 호출됩니까? (0) | 2020.06.19 |