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?


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)


34
Se você deseja verificar um byte específico [], você pode usarAdditionalMatchers.aryEq(expectedArray)
John Oxley

5
Ou Matchers. <Byte []> any ().
jbyler


12

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


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 }));


0

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

verify(myMock, times(0)).setContents(any(), any());

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);
}

-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;
    }
}));

Escrever um correspondente personalizado, quando o Mockito é capaz de lidar com esse caso de uso, está apenas adicionando dívida técnica.
Linuxdan #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.