В процессе тестирования программ на 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), которые полностью контролируют поведение объекта. Использование шпионов подразумевает, что тестируемый код связан с внешним состоянием, что может привести к более сложным и малопредсказуемым тестам.
Добавить комментарий