Mockito matcher e conjunto de primitivas

226

Com o Mockito, quero verify()uma chamada de método byte[]na sua lista de argumentos, mas não encontrei como escrever isso.

 myMethod( byte[] )

Eu só quero algo como anyByteArray(), como fazer isso com Mockito?

tbruyelle
fonte
Você realmente não se importa com o conteúdo da matriz de bytes? Eu vejo isso muito em testes de unidade, onde as pessoas usam matchers anyX () porque são convenientes, mas, na realidade, você quase sempre deve se importar com o que está sendo passado. Se você não estiver usando uma resposta que realmente consuma o valor, provavelmente deve corresponder a um argumento esperado real.
Matunos 23/07
@ Matunos: Isso é discutível. O uso de qualquer match-match pode simplificar os testes e a próxima pessoa que olha o teste não se distrai com a correspondência desnecessariamente precisa e pode se concentrar no objetivo real do teste.
Malik Atalla
@ tbruelle: Lembre-se de que toda matriz em Java é um objeto. Isso o ajudaria no começo.
Tomasz Przybylski

Respostas:

424

eu tentaria any(byte[].class)

gpeche
fonte
34
Se você deseja verificar um byte específico [], você pode usarAdditionalMatchers.aryEq(expectedArray)
John Oxley
5
Ou Matchers. <Byte []> any ().
jbyler
31

Tente o seguinte:

AdditionalMatchers.aryEq(array);
Alécio Carvalho
fonte
12

Eu prefiro usar Matchers.<byte[]>any(). Isso funcionou para mim.

Fabiano Francesconi
fonte
1
Aviso para todos: Agora está obsoleto assim que eu iria para a resposta votado (classe byte [].) Mockito.any
Chexpir
10

Eu concordo com Mutanos e Alecio. Além disso, é possível verificar o maior número possível de chamadas de método idênticas (verificando as chamadas subseqüentes no código de produção, a ordem da verificação não importa). Aqui está o código:

import static org.mockito.AdditionalMatchers.*;

    verify(mockObject).myMethod(aryEq(new byte[] { 0 }));
    verify(mockObject).myMethod(aryEq(new byte[] { 1, 2 }));
Rene Ummels
fonte
1

Eu usei Matchers.refEqpara isso.

Bowofola
fonte
0

Você pode usar Mockito.any () quando argumentos também são matrizes. Eu usei assim:

verify(myMock, times(0)).setContents(any(), any());
Crenguta S
fonte
0

O que funciona para mim foi org.mockito.ArgumentMatchers.isA

por exemplo:

isA(long[].class)

isso funciona bem.

a diferença de implementação um do outro é:

public static <T> T any(Class<T> type) {
    reportMatcher(new VarArgAware(type, "<any " + type.getCanonicalName() + ">"));
    return Primitives.defaultValue(type);
}

public static <T> T isA(Class<T> type) {
    reportMatcher(new InstanceOf(type));
    return Primitives.defaultValue(type);
}
Milton Jacomini Neto
fonte
-1

Você sempre pode criar um Matcher personalizado usando argThat

Mockito.verify(yourMockHere).methodCallToBeVerifiedOnYourMockHere(ArgumentMatchers.argThat(new ArgumentMatcher<Object>() {
    @Override
    public boolean matches(Object argument) {
        YourTypeHere[] yourArray = (YourTypeHere[]) argument;
        // Do whatever you like, here is an example:
        if (!yourArray[0].getStringValue().equals("first_arr_val")) {
            return false;
        }
        return true;
    }
}));
Koray Tugay
fonte
Escrever um correspondente personalizado, quando o Mockito é capaz de lidar com esse caso de uso, está apenas adicionando dívida técnica.
Linuxdan #