Mockito: матчинг любого аргумента класса и возврат нового
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для замены аргументов любого типа используйте any()
, либо воспользуйтесь методом any(Class<T>)
для конкретного типа T
.
Пример:
when(mock.someMethod(any())).thenReturn(someValue);
При использовании специфичного класса:
when(mock.function(any(MyClass.class))).thenReturn(someValue);
Вместо someMethod
и someValue
укажите имя метода и ожидаемое значение соответственно. MyClass.class
замените на тип класса, который необходим для тестирования.
Встроенные матчеры Mockito: выбор подходящего инструмента
Правильный выбор инструмента для каждой задачи отрабатывается со временем и в области программирования этому уделено особое место. В Mockito за это отвечают матчеры, которые помогают настроить условия создания заглушек. any()
и any(Class<T>)
— это только некоторые из возможностей, сравнивая их можно представить универсальные столовые ножи в большой кухне.
Стандартные матчеры
Помимо any()
, Mockito предоставляет также матчеры isA(Class<T>)
и (T) notNull()
.
when(mock.someMethod(isA(MyClass.class))).thenReturn(someValue);
// Метода не активируется при использовании "null".
when(mock.someMethod(notNull())).thenReturn(someValue);
Персональные матчеры
Если встроенных матчеров не достаточно, всегда можно создать собственное решение. Создайте класс, наподобие MyCustomMatcher
, наследуясь от ArgumentMatcher
и производя проверку на соответствие подклассам.
when(mock.someMethod(argThat(new MyCustomMatcher()))).thenReturn(someValue);
Визуализация
Метод any()
в Mockito для замены аргументов разных классов можно сравнить с главным ключом, открывающим доступ ко всем методам.
Mockito.when(yourService.yourMethod(ArgumentMatchers.<YourClass>any())).thenReturn(yourResponse);
Каждый метод представляется в виде закрытого замка:
🚪🔑🚪
`any()` работает как **главный ключ**:
| Вызов метода | Ключ |
| ------------------------- | --------------- |
| Специфичный класс | 🗝️ (Основной ключ) |
| Mockito `any()` | 🗝️🌐 (Главный ключ) |
С таким 'главным ключом' вы можете тестировать вызовы методов с любыми аргументами классов. ✨
Дополнительные матчеры для опытных разработчиков
Нередко возникает необходимость более детального управления моками. В таких ситуациях следует использовать персональные матчеры. Создавая свои условия с помощью org.hamcrest.BaseMatcher
, вы получаете гибкий контроль над процессом тестирования.
Объект-хамелеон: Matchers.any
Matchers.any()
может приягаться к любому классу или его подклассам, уже будучи универсальным матчером.
when(mock.someMethod(Matchers.<Class<A>>any())).thenReturn(instanceOfB);
// Готов дать ответ любому обращавшемуся как "B".
Симуляция точной проверки аргументов
Для работы с универсальными типами или сложными сигнатурами методов идеально подходит пользовательский ArgumentMatcher.
when(mock.someMethod(argThat(new MyTypeSafeMatcher<>()))).thenReturn(someValue);
// Подходит для безопасной работы с универсальными типами.
MyTypeSafeMatcher
тщательно анализирует характеристики универсального типа для точного сопоставления при создании заглушек.
Полезные материалы
- ArgumentMatchers – mockito-core 5.10.0 javadoc — официальная документация по матчерам аргументов Mockito.
- Unit tests with Mockito – Tutorial — глубокий обзор юнит-тестирования с использованием Mockito.
- GitHub – mockito/mockito: Moст популярный фреймворк для создания mock-объектов в юнит-тестах для Java — исходный код и последние обновления Mockito в официальном репозитории на GitHub.
- Как писать хорошие тесты · mockito/mockito Wiki · GitHub — рекомендации по эффективному использованию Mockito в тестах.
- Что такое
Mockito.any()
иMockito.any(Class)
— подробное объяснение с примерами на StackOverflow.