Создание матчера для byte[] в Mockito: руководство
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы подменить метод, который принимает массив примитивных типов в библиотеке Mockito, можно сочетать использование any()
с AdditionalMatchers.aryEq()
. Ниже представлен пример:
import static org.mockito.Mockito.*;
import static org.mockito.AdditionalMatchers.aryEq;
// Приведем пример тестового метода:
int[] perfectSquareNumbers = {1, 4, 9}; // Идеальные квадратные числа!
when(mock.someMethod(aryEq(perfectSquareNumbers))).thenReturn(someValue);
Примечание: Не забывайте использовать aryEq()
для точного и надёжного сравнения массивов, которое проверяет значения, а не ссылки.
Работаем с произвольным массивом
Если содержимое массива для вас не важно, то предпочтительно использовать any()
:
import static org.mockito.ArgumentMatchers.any;
when(mock.mysteriousMethod(any(byte[].class))).thenReturn(someValue); // Здесь ничего обвиняющего!
Точная проверка массива
Если нужно работать с массивом с заданными значениями, используйте aryEq()
:
import static org.mockito.Mockito.verify;
verify(mock).specialMethod(aryEq(new byte[]{0x10, 0x20})); // Парочка друзей в шестнадцатеричной системе
Создание собственных матчеров
Создание собственных матчеров для массивов примитивов возможно, но это может быть сложным и трудоёмким делом. Чаще всего легче использовать aryEq()
, а порядок вызовов verify
на результат теста не влияет:
verify(mock).awesomeMethod(aryEq(new byte[]{0x01, 0x02})); // Проверено на прочность
verify(mock).coolMethodTwo(aryEq(new byte[]{0x03, 0x04})); // Весёлая парочка
Визуализация
Представьте себе лучника (🏹), каждая стрела которого символизирует уникальное примитивное значение в массиве. Ваша задача заключается в том, чтобы поразить мишени (🎯🎯🎯), каждая из которых соответствует отдельному элементу массива при проверке с помощью Mockito.
🏹 Стрела №1 = значение 5
🏹 Стрела №2 = значение 10
🏹 Стрела №3 = значение 15
Первоначально ваши цели примерно такие:
[ 5, 10, 15 ]
Сопоставитель Mockito всегда поможет вам попасть в цель:
when(mockedClass.methodWithIntArray(argThat(hasItemInArray(10)))).thenReturn(true);
🏹 ➡️ 🎯 Сопоставитель обеспечивает, что стрела со значением 10 точно попадет в десятку!
После того, как все цели достигнуты:
[ ✅, ✅, ✅ ]
// Попадания соответствуют матчерам, прицелены на конкретные цели.
Таким образом каждое примитивное значение в массиве имеет шанс стать заметным благодаря подходящему матчеру.
Глубокое имитирование с использованием сложных матчеров
Глубокое имитирование становится актуальным, когда мы вдаемся в детали. Matchers.refEq
можно использовать в качестве альтернативы aryEq()
, он особенно полезен в случаях работы с массивами внутри вложенных объектов:
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
when(mock.someMethod().getNestedByteArr()).thenReturn(someNestedArr); // До самого конца!
Когда работы с массивами становится сложной
Работа со массивами может стать сложной, если в них присутствуют значения по умолчанию, большие массивы или если структура данных избыточно усложнена. В этих случаях следует использовать ArgumentCaptor или настроить матчеры аргументов для корректной настройки поведения и обеспечения безупречного выполнения тестов.
Полезные материалы
- ArgumentMatchers – mockito-core 5.10.0 javadoc — Узнайте ещё больше о матчерах аргументов и возможностях библиотеки Mockito.
- GitHub – mockito/mockito: Лидирующий фреймворк для модульного тестирования на Java — Познакомьтесь с миром Mockito и найдите множество полезных примеров кода.
- ArgumentCaptor (Mockito 3.5.13 API) — Изучите, как захватывать аргументы с помощью ArgumentCaptor для точной проверки в тестах.
- Пользовательское руководство JUnit 5 — Подробное руководство по модульному тестированию с использованием JUnit 5 и Mockito.
- Массивы (Учебник по Java™ > Основные классы Java > Основы) — Углубите свое знание массивов в Java, опираясь на официальный учебник от Oracle.
- Mockito (API Mockito 3.3.3) — Узнайте больше о глубоком имитировании с использованием библиотеки Mockito.