Mockito: матчинг любого аргумента класса и возврат нового

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

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

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

Для замены аргументов любого типа используйте any(), либо воспользуйтесь методом any(Class<T>) для конкретного типа T.

Пример:

Java
Скопировать код
when(mock.someMethod(any())).thenReturn(someValue);

При использовании специфичного класса:

Java
Скопировать код
when(mock.function(any(MyClass.class))).thenReturn(someValue);

Вместо someMethod и someValue укажите имя метода и ожидаемое значение соответственно. MyClass.class замените на тип класса, который необходим для тестирования.

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

Встроенные матчеры Mockito: выбор подходящего инструмента

Правильный выбор инструмента для каждой задачи отрабатывается со временем и в области программирования этому уделено особое место. В Mockito за это отвечают матчеры, которые помогают настроить условия создания заглушек. any() и any(Class<T>) — это только некоторые из возможностей, сравнивая их можно представить универсальные столовые ножи в большой кухне.

Стандартные матчеры

Помимо any(), Mockito предоставляет также матчеры isA(Class<T>) и (T) notNull().

Java
Скопировать код
when(mock.someMethod(isA(MyClass.class))).thenReturn(someValue);
// Метода не активируется при использовании "null".
when(mock.someMethod(notNull())).thenReturn(someValue);

Персональные матчеры

Если встроенных матчеров не достаточно, всегда можно создать собственное решение. Создайте класс, наподобие MyCustomMatcher, наследуясь от ArgumentMatcher и производя проверку на соответствие подклассам.

Java
Скопировать код
when(mock.someMethod(argThat(new MyCustomMatcher()))).thenReturn(someValue);

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

Метод any() в Mockito для замены аргументов разных классов можно сравнить с главным ключом, открывающим доступ ко всем методам.

Markdown
Скопировать код
Mockito.when(yourService.yourMethod(ArgumentMatchers.<YourClass>any())).thenReturn(yourResponse);

Каждый метод представляется в виде закрытого замка:
🚪🔑🚪

`any()` работает как **главный ключ**:

| Вызов метода              | Ключ            |
| ------------------------- | --------------- |
| Специфичный класс         | 🗝️ (Основной ключ) |
| Mockito `any()`           | 🗝️🌐 (Главный ключ)    |

С таким 'главным ключом' вы можете тестировать вызовы методов с любыми аргументами классов. ✨

Дополнительные матчеры для опытных разработчиков

Нередко возникает необходимость более детального управления моками. В таких ситуациях следует использовать персональные матчеры. Создавая свои условия с помощью org.hamcrest.BaseMatcher, вы получаете гибкий контроль над процессом тестирования.

Объект-хамелеон: Matchers.any

Matchers.any() может приягаться к любому классу или его подклассам, уже будучи универсальным матчером.

Java
Скопировать код
when(mock.someMethod(Matchers.<Class<A>>any())).thenReturn(instanceOfB);
// Готов дать ответ любому обращавшемуся как "B".

Симуляция точной проверки аргументов

Для работы с универсальными типами или сложными сигнатурами методов идеально подходит пользовательский ArgumentMatcher.

Java
Скопировать код
when(mock.someMethod(argThat(new MyTypeSafeMatcher<>()))).thenReturn(someValue);
// Подходит для безопасной работы с универсальными типами.

MyTypeSafeMatcher тщательно анализирует характеристики универсального типа для точного сопоставления при создании заглушек.

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

  1. ArgumentMatchers – mockito-core 5.10.0 javadoc — официальная документация по матчерам аргументов Mockito.
  2. Unit tests with Mockito – Tutorial — глубокий обзор юнит-тестирования с использованием Mockito.
  3. GitHub – mockito/mockito: Moст популярный фреймворк для создания mock-объектов в юнит-тестах для Java — исходный код и последние обновления Mockito в официальном репозитории на GitHub.
  4. Как писать хорошие тесты · mockito/mockito Wiki · GitHub — рекомендации по эффективному использованию Mockito в тестах.
  5. Что такое Mockito.any() и Mockito.any(Class) — подробное объяснение с примерами на StackOverflow.