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


226

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

 myMethod( byte[] )

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


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

@Matunos: Это спорно. Использование any-matchers может упростить тесты, и следующий человек, смотрящий на тест, не будет отвлекаться на излишне точное соответствие и может сосредоточиться на реальной цели теста.
Малик Аталла

@tbruelle: Пожалуйста, имейте в виду, что каждый массив в Java является объектом. Это поможет вам в начале.
Томаш Прзыбыльски

Ответы:


424

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


34
Если вы хотите проверить конкретный байт [], который вы можете использоватьAdditionalMatchers.aryEq(expectedArray)
Джон Оксли,

5
Или Matchers. <Byte []> любой ().
Jbyler


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


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.