Mockito matcher та масив примітивів


226

За допомогою Mockito я хочу verify()викликати метод byte[]у своєму списку аргументів, але я не знайшов, як це написати.

 myMethod( byte[] )

Я просто хочу щось подібне anyByteArray(), як це зробити з Mockito?


Вам справді все одно, який вміст байтового масиву? Я бачу це багато в одиничному тестуванні, де люди використовують відповідники anyX (), тому що вони зручні, але реально вам майже завжди слід дбати про те, що передається. Якщо ви не використовуєте відповідь, який фактично споживає цінність, ви, ймовірно, має відповідати фактично очікуваному аргументу.
Матунос

@ Матунос: Це дискусійно. Використання будь-яких матчів може зробити тести простішими, і наступна людина, яка дивиться на тест, не буде відволікатися на непотрібне точне узгодження і може зосередитись на фактичній меті тесту.
Малік Аталла

@tbruelle: Майте на увазі, що кожен масив на Java - це об'єкт. Це допоможе вам на початку.
Томаш Пшибильський

Відповіді:


424

Я б спробував any(byte[].class)


34
Якщо ви хочете перевірити конкретний байт [], ви можете використовуватиAdditionalMatchers.aryEq(expectedArray)
Джон Окслі

5
Або Matchers. <Байт []> будь-який ().
jbyler


12

Я вважаю за краще використовувати Matchers.<byte[]>any(). Це працювало для мене.


1
Попередження для всіх: Зараз застаріле, тому я б хотів проголосувати відповідь Mockito.any (байт []. Клас)
Chexpir

10

Я згоден з Мутаносом і Алесіо. Крім того, можна перевірити якомога більше однакових викликів методів (перевірка подальших викликів у виробничому коді, порядок верифікації не має значення). Ось код:

import static org.mockito.AdditionalMatchers.*;

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


0

Ви можете використовувати Mockito.any (), коли аргументи також є масивами. Я використовував це так:

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

0

Що для мене працювало org.mockito.ArgumentMatchers.isA

наприклад:

isA(long[].class)

це добре працює.

різниця в реалізації один одного:

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

Ви завжди можете створити спеціальний Matcher, використовуючи 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;
    }
}));

Написання користувальницького відповідника, коли Mockito здатний обробляти цей випадок використання, додає лише технічну заборгованість.
linuxdan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.