Исправление WrongTypeOfReturnValue в Mockito: причины и решения

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

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

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

Если вы сталкиваетесь с исключением Mockito WrongTypeOfReturnValue и требуется быстро распознать решение, убедитесь, что значение, передающееся в thenReturn(), соответствует типу значения, возвращаемого мокируемым методом. Например, если метод принимает List<String>, то укажите именно List<String>, а не String или любой другой тип данных.

Java
Скопировать код
when(mockedObject.expectedMethod()).thenReturn(correctTypeValue);

Необходимо, чтобы переменная correctTypeValue соответствовала типу данных, который предполагается методом expectedMethod(). В противном случае Mockito создаст исключение.

Чтобы исключение не появились, можно использовать метод doReturn().when():

Java
Скопировать код
doReturn(correctTypeValue).when(mockedObject).expectedMethod();
Кинга Идем в IT: пошаговый план для смены профессии

Плюсы точного мокирования: doReturn().when()

В некоторых случаях doReturn().when() более предпочтителен, чем традиционный when().thenReturn(), поскольку он не выполняет проверку типов, которую осуществляет thenReturn() и помогает избежать исключения типа WrongTypeOfReturnValue. Этот метод наиболее полезен при работе с перегруженными методами, помогая избавиться от путаницы с типами.

Отладка: ваш надёжный помощник

Для успешной отладки убедитесь, что мокируемый метод public и доступен. Mockito не взаимодействует с приватными или защищёнными методами. Проверьте стек вызовов для выяснения, где возникла проблема.

Поток, которому стоит опасаться

Тестирование может стать более сложным при использовании многопоточности, которая может привести к ошибкам из-за изменения состояния мокированных объектов различными потоками. Это может вызвать возврат некорректного значения.

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

Представьте, что вы заказали велосипед 🚲. Будет ли корректно, если вместо него вам доставят грузовик 🚚?

{{Работа}} Mockito аналогична курьеру, который удивляется, доставив неправильный заказ:

Java
Скопировать код
// Заказали велосипед и получили велосипед — всё замечательно.
when(bicycleShop.orderBike()).thenReturn(new Bicycle()); // 🚲 Всё великолепно!

// Заказали велосипед, но привезли грузовик — это хаос!
when(bicycleShop.orderBike()).thenReturn(new Truck()); // 🚚 Хаос!

Выбрасывается исключение: WrongTypeOfReturnValue. Ваши ожидания от курьера не меньше, чем от Mockito, который всегда ожидает правильного типа объекта.

Проблемы с типами значений, возвращаемых методами: Что, Почему и Как

Следите за типами значений, возвращаемых методами

Обратите особое внимание на типы значений, возвращаемых методами. Несоответствие может стать причиной проблем, поскольку Mockito ожидает строгого соответствия типов.

Опасность использования реальных объектов

Использование реальных экземпляров объектов в тестах может привести к неприятным последствиям, поскольку они могут возвращать неожиданные значения. Убедитесь, что за возвращаемые значения отвечают только мокированные объекты.

Вооружайтесь знаниями

Воспользуйтесь доступными онлайн ресурсами для улучшения понимания работы с Mockito. Это поможет быстрее находить решения и упростит отладку.

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

  1. WrongTypeOfReturnValue – mockito-core 5.10.0 javadoc — официальная документация Mockito.
  2. Юнит-тесты с Mockito – Учебник — учебник по использованию Mockito.
  3. Уроки Mockito – Java Code Geeks — серия уроков по Mockito.
  4. Руководство по юнит-тестированию с Mockito | Toptal — дополнительные советы и хитрости использования Mockito.
  5. ios – Медленные CSS фильтры на iPhone? – Stack Overflow — пример не по теме, но все мы можем делать ошибки. Следующий раз будем проверять контекст внимательнее!