Eu tenho tentado zombar de um método com parâmetros vararg usando o Mockito:
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));
Isso não funciona, no entanto, se eu fizer isso:
when(a.b(anyInt(), anyInt())).thenReturn(b);
assertEquals(b, a.b(1, 2));
Isso funciona, apesar de eu ter omitido completamente o argumento varargs ao remover o método.
Alguma pista?
java
mocking
variadic-functions
mockito
qualidafial
fonte
fonte
Respostas:
O Mockito 1.8.1 introduziu o matcher Vararg () :
Veja também o histórico para isso: https://code.google.com/archive/p/mockito/issues/62
Edite a nova sintaxe após a descontinuação:
fonte
anyVararg()
tem Object como seu tipo de retorno. Para torná-lo compatível com qualquer tipo de var arg (por exemplo, String ..., Inteiro ..., etc.), faça uma conversão explícita. Por exemplo, se você tiver,doSomething(Integer number, String ... args)
poderá executar o código de simulação / stub com algo parecidowhen(mock).doSomething(eq(1), (String) anyVarargs())
. Isso deve resolver o erro de compilação.Matchers
agora está obsoleto para evitar um conflito de nome com aorg.hamcrest.Matchers
classe e provavelmente será removido no mockito v3.0. Use emArgumentMatchers
vez disso.Um recurso não documentado: se você deseja desenvolver um Matcher personalizado que corresponda aos argumentos vararg, é necessário implementá
org.mockito.internal.matchers.VarargMatcher
-lo para que funcione corretamente. É uma interface de marcador vazia, sem a qual o Mockito não comparará corretamente os argumentos ao invocar um método com varargs usando seu Matcher.Por exemplo:
fonte
Com base na resposta de Eli Levine, aqui está uma solução mais genérica:
Em seguida, você pode usá-lo com os correspondentes de matriz do hamcrest assim:
(Obviamente, as importações estáticas tornarão isso mais legível.)
fonte
Eu tenho usado o código na resposta de Peter Westmacott, no entanto, com o Mockito 2.2.15, agora você pode fazer o seguinte:
verify(a).method(100L, arg1, arg2, arg3)
Onde
arg1, arg2, arg3
estão os varargs.fonte
Com base na resposta do topchef,
Para o 2.0.31-beta, eu tive que usar o Mockito.anyVararg em vez do Matchers.anyVararrg:
fonte
No meu caso, a assinatura do método que eu quero capturar seu argumento é:
Nesse caso, você deve converter a matriz de bytes explicitamente:
Estou usando a versão mockito
1.10.19
fonte
Você também pode fazer um loop sobre os argumentos:
por exemplo, verifique seus tipos e faça a conversão adequada, adicione a uma lista ou o que for.
fonte
Adaptando a resposta de @topchef,
De acordo com os documentos java do Mockito 2.23.4, Mockito.any () "Corresponde a qualquer coisa, incluindo valores nulos e variáveis".
fonte
Você pode fazer isso passando uma captura ArgumentCaptor e recuperando os varargs como uma lista usando "getAllValues", consulte: https://stackoverflow.com/a/55621731/11342928
fonte