Создание матчера для byte[] в Mockito: руководство

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы подменить метод, который принимает массив примитивных типов в библиотеке Mockito, можно сочетать использование any() с AdditionalMatchers.aryEq(). Ниже представлен пример:

Java
Скопировать код
import static org.mockito.Mockito.*;
import static org.mockito.AdditionalMatchers.aryEq;

// Приведем пример тестового метода:
int[] perfectSquareNumbers = {1, 4, 9}; // Идеальные квадратные числа!

when(mock.someMethod(aryEq(perfectSquareNumbers))).thenReturn(someValue);

Примечание: Не забывайте использовать aryEq() для точного и надёжного сравнения массивов, которое проверяет значения, а не ссылки.

Кинга Идем в IT: пошаговый план для смены профессии

Работаем с произвольным массивом

Если содержимое массива для вас не важно, то предпочтительно использовать any():

Java
Скопировать код
import static org.mockito.ArgumentMatchers.any;

when(mock.mysteriousMethod(any(byte[].class))).thenReturn(someValue); // Здесь ничего обвиняющего!

Точная проверка массива

Если нужно работать с массивом с заданными значениями, используйте aryEq():

Java
Скопировать код
import static org.mockito.Mockito.verify;
verify(mock).specialMethod(aryEq(new byte[]{0x10, 0x20})); // Парочка друзей в шестнадцатеричной системе

Создание собственных матчеров

Создание собственных матчеров для массивов примитивов возможно, но это может быть сложным и трудоёмким делом. Чаще всего легче использовать aryEq(), а порядок вызовов verify на результат теста не влияет:

Java
Скопировать код
verify(mock).awesomeMethod(aryEq(new byte[]{0x01, 0x02})); // Проверено на прочность
verify(mock).coolMethodTwo(aryEq(new byte[]{0x03, 0x04})); // Весёлая парочка

Визуализация

Представьте себе лучника (🏹), каждая стрела которого символизирует уникальное примитивное значение в массиве. Ваша задача заключается в том, чтобы поразить мишени (🎯🎯🎯), каждая из которых соответствует отдельному элементу массива при проверке с помощью Mockito.

Markdown
Скопировать код
🏹 Стрела №1 = значение 5
🏹 Стрела №2 = значение 10
🏹 Стрела №3 = значение 15

Первоначально ваши цели примерно такие:

Markdown
Скопировать код
[ 5, 10, 15 ]

Сопоставитель Mockito всегда поможет вам попасть в цель:

Java
Скопировать код
when(mockedClass.methodWithIntArray(argThat(hasItemInArray(10)))).thenReturn(true);

🏹 ➡️ 🎯 Сопоставитель обеспечивает, что стрела со значением 10 точно попадет в десятку!

После того, как все цели достигнуты:

Markdown
Скопировать код
[ ✅, ✅, ✅ ]
// Попадания соответствуют матчерам, прицелены на конкретные цели.

Таким образом каждое примитивное значение в массиве имеет шанс стать заметным благодаря подходящему матчеру.

Глубокое имитирование с использованием сложных матчеров

Глубокое имитирование становится актуальным, когда мы вдаемся в детали. Matchers.refEq можно использовать в качестве альтернативы aryEq(), он особенно полезен в случаях работы с массивами внутри вложенных объектов:

Java
Скопировать код
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;

when(mock.someMethod().getNestedByteArr()).thenReturn(someNestedArr); // До самого конца!

Когда работы с массивами становится сложной

Работа со массивами может стать сложной, если в них присутствуют значения по умолчанию, большие массивы или если структура данных избыточно усложнена. В этих случаях следует использовать ArgumentCaptor или настроить матчеры аргументов для корректной настройки поведения и обеспечения безупречного выполнения тестов.

Полезные материалы

  1. ArgumentMatchers – mockito-core 5.10.0 javadoc — Узнайте ещё больше о матчерах аргументов и возможностях библиотеки Mockito.
  2. GitHub – mockito/mockito: Лидирующий фреймворк для модульного тестирования на Java — Познакомьтесь с миром Mockito и найдите множество полезных примеров кода.
  3. ArgumentCaptor (Mockito 3.5.13 API) — Изучите, как захватывать аргументы с помощью ArgumentCaptor для точной проверки в тестах.
  4. Пользовательское руководство JUnit 5 — Подробное руководство по модульному тестированию с использованием JUnit 5 и Mockito.
  5. Массивы (Учебник по Java™ > Основные классы Java > Основы) — Углубите свое знание массивов в Java, опираясь на официальный учебник от Oracle.
  6. Mockito (API Mockito 3.3.3) — Узнайте больше о глубоком имитировании с использованием библиотеки Mockito.