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

226

С Mockito я хочу verify()вызвать метод с byte[]его списком аргументов, но я не нашел, как это написать.

 myMethod( byte[] )

Я просто хочу что-то вроде anyByteArray(), как это сделать с Mockito?

tbruyelle
источник
Вам действительно все равно, каково содержимое байтового массива? Я часто вижу это в модульном тестировании, где люди используют любые средства сопоставления anyX (), потому что они удобны, но реально вам почти всегда нужно заботиться о том, что передается. Если вы не используете ответ, который фактически потребляет значение, вы, вероятно, должен соответствовать фактическому ожидаемому аргументу.
Матунос
@Matunos: Это спорно. Использование any-matchers может упростить тесты, и следующий человек, смотрящий на тест, не будет отвлекаться на излишне точное соответствие и может сосредоточиться на реальной цели теста.
Малик Аталла
@tbruelle: Пожалуйста, имейте в виду, что каждый массив в Java является объектом. Это поможет вам в начале.
Томаш Прзыбыльски

Ответы:

424

я бы попробовал any(byte[].class)

gpeche
источник
34
Если вы хотите проверить конкретный байт [], который вы можете использоватьAdditionalMatchers.aryEq(expectedArray)
Джон Оксли,
5
Или Matchers. <Byte []> любой ().
Jbyler
31

Попробуй это:

AdditionalMatchers.aryEq(array);
Альесио Карвалью
источник
12

Я бы предпочел использовать Matchers.<byte[]>any(). Это сработало для меня.

Фабиано Франческони
источник
1
Предупреждение для всех: теперь устарела, поэтому я бы пошел за проголосовавший ответ Mockito.any (byte []. Class)
Chexpir
10

Я согласен с Мутаносом и Алесио. Кроме того, можно проверить как можно больше одинаковых вызовов методов (при проверке последующих вызовов в производственном коде порядок проверки не имеет значения). Вот код:

import static org.mockito.AdditionalMatchers.*;

    verify(mockObject).myMethod(aryEq(new byte[] { 0 }));
    verify(mockObject).myMethod(aryEq(new byte[] { 1, 2 }));
Рене Уммельс
источник
1

Я использовал Matchers.refEqдля этого.

Bowofola
источник
0

Вы можете использовать Mockito.any (), когда аргументы также являются массивами. Я использовал это так:

verify(myMock, times(0)).setContents(any(), any());
Crenguta S
источник
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