Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
21 Мар 2024
2 мин
241

Mockito: исправляем проблему с вызовом оригинального метода при шпионаже

В процессе тестирования программ на Java с использованием библиотеки Mockito возникают различные задачи. Одной из них является необходимость изменить

В процессе тестирования программ на Java с использованием библиотеки Mockito возникают различные задачи. Одной из них является необходимость изменить поведение отдельного метода класса в рамках JUnit-теста. Для этого используется так называемое «шпионство» или «spy».

Рассмотрим пример. Предположим, есть некоторый класс MyClass с методом method1(). От этого класса создан экземпляр myInstance. Задача состоит в том, чтобы при вызове method1() возвращался определенный объект myResults, а не выполнялся оригинальный код метода.

final MyClass myClassSpy = Mockito.spy(myInstance);
Mockito.when(myClassSpy.method1()).thenReturn(myResults);

Однако в данной ситуации возникает проблема: при вызове myClassSpy.method1() во второй строке кода, на самом деле вызывается оригинальный метод, что приводит к исключению. Это происходит потому, что Mockito вначале вызывает оригинальный метод, а затем переопределяет его поведение.

Чтобы решить данную проблему, следует использовать метод doReturn(), который позволяет определить возвращаемое значение без вызова оригинального метода.

final MyClass myClassSpy = Mockito.spy(myInstance);
Mockito.doReturn(myResults).when(myClassSpy).method1();

Таким образом, при вызове myClassSpy.method1() в дальнейшем будет возвращаться объект myResults, а оригинальный метод не будет вызываться.

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

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий