Mockito отличие Spy и Mock

Mockito — это популярная платформа для создания заглушек в Java, которая позволяет разработчикам создавать моки объектов и методы-заглушки для целей тестирования. Mockito предоставляет два основных типа объектов для тестирования: Mock и Spy.

Мок-объект — это фиктивный объект, созданный для имитации поведения реального объекта. Он используется для проверки поведения тестируемого кода изолированно от других компонентов. Мок-объект создается с помощью метода Mockito.mock(), и все его методы имеют значения по умолчанию.

С другой стороны, объект Spy — это реальный объект, обернутый Mockito и позволяющий выборочно имитировать определенные методы. Его можно использовать для проверки поведения реального объекта, сохраняя при этом возможность имитировать определенные методы. Такой объект создается с использованием метода Mockito.spy() и позволяет разработчику выборочно переопределять определенные методы, при этом вызывая реальную реализацию других.

Таким образом, основное различие между mock и spy объектами в Mockito заключается в том, что mock объект — это полностью фальшивый объект, имитирующий поведение реального объекта, тогда как Spy объект — это реальный объект, обернутый Mockito и допускающий выборочное изменение определенных методов.

Приведу несколько примеров кода, иллюстрирующих разницу между mock и spy объектами в Mockito. Создание объекта Mock:

// Создание mock объекта интерфейса UserService
UserService userServiceMock = Mockito.mock(UserService.class);

// Настройка поведения заглушки метода getUserById() для возврата user с id 1
User user = new User(1, "John");
Mockito.when(userServiceMock.getUserById(1)).thenReturn(user);

// Вызов метода getUserById() на mock объекте
User result = userServiceMock.getUserById(1);

// Проверка вызова метода с таким же как аргументом как настраивали заглушку
Mockito.verify(userServiceMock).getUserById(1);

// Проверка ожидаемого результата
assertEquals(user, result);

Создание объекта Spy

// Создание spy объекта класса UserServiceImpl
UserService userServiceSpy = Mockito.spy(new UserServiceImpl());

// Настройка заглушки метода getUserById() для возврата user с id 1
User user = new User(1, "John");
Mockito.doReturn(user).when(userServiceSpy).getUserById(1);

// Вызов метода getUserById() на spy объекте
User result = userServiceSpy.getUserById(1);

// Проверка вызова метода с таким же как аргументом как настраивали заглушку
Mockito.verify(userServiceSpy).getUserById(1);

// Проверка ожидаемого результата
assertEquals(user, result);

// Переопределение метода saveUser()
Mockito.doNothing().when(userServiceSpy).saveUser(Mockito.any(User.class));

// Вызов метода saveUser() на spy объекте
User newUser = new User(2, "Jane");
userServiceSpy.saveUser(newUser);

// Проверка вызова метода с таким же как аргументом как настраивали заглушку
Mockito.verify(userServiceSpy).saveUser(newUser);

// Проверка вызова метода с другим аргументом
Mockito.verify(userServiceSpy, Mockito.never()).saveUser(Mockito.anyString());