Что такое mocks/stubs/spies и чем они отличаются?
1️⃣ Как кратко ответить
Mocks, stubs и spies — это тестовые двойники, используемые в автоматизированном тестировании для изоляции тестируемого кода. Stubs предоставляют предопределенные ответы на вызовы, mocks проверяют взаимодействие с объектами, а spies следят за вызовами методов и позволяют проверять их параметры и количество вызовов.
2️⃣ Подробное объяснение темы
В автоматизированном тестировании, особенно при тестировании на уровне юнит-тестов, важно изолировать тестируемый код от внешних зависимостей. Это позволяет сосредоточиться на тестировании конкретной функциональности без влияния внешних факторов. Для этого используются тестовые двойники: mocks, stubs и spies.
Stubs
Stubs — это простейшие тестовые двойники, которые предоставляют предопределенные ответы на вызовы методов. Они не содержат логики и не проверяют взаимодействие с объектами. Stubs используются, когда необходимо заменить сложные или ненадежные зависимости простыми заглушками.
Пример использования stubs:
public class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User getUserById(int id) {
return userRepository.findById(id);
}
}
// Stub для UserRepository
public class UserRepositoryStub implements UserRepository {
@Override
public User findById(int id) {
return new User(id, "Test User");
}
}
// Тест
UserRepository userRepositoryStub = new UserRepositoryStub();
UserService userService = new UserService(userRepositoryStub);
User user = userService.getUserById(1);
// user будет содержать объект User с id 1 и именем "Test User"
Mocks
Mocks — это более сложные тестовые двойники, которые не только предоставляют предопределенные ответы, но и проверяют взаимодействие с объектами. Mocks позволяют убедиться, что методы вызываются с правильными параметрами и в нужное время.
Пример использования mocks с использованием библиотеки Mockito:
import static org.mockito.Mockito.*;
public class UserServiceTest {
@Test
public void testGetUserById() {
UserRepository userRepositoryMock = mock(UserRepository.class);
UserService userService = new UserService(userRepositoryMock);
when(userRepositoryMock.findById(1)).thenReturn(new User(1, "Mock User"));
User user = userService.getUserById(1);
// Проверка, что метод findById был вызван с параметром 1
verify(userRepositoryMock).findById(1);
// user будет содержать объект User с id 1 и именем "Mock User"
}
}
Spies
Spies — это тестовые двойники, которые следят за вызовами методов реальных объектов. Они позволяют проверять параметры вызовов и количество вызовов, сохраняя при этом оригинальную функциональность объекта.
Пример использования spies с использованием библиотеки Mockito:
import static org.mockito.Mockito.*;
public class UserServiceTest {
@Test
public void testGetUserByIdWithSpy() {
UserRepository realRepository = new UserRepositoryImpl();
UserRepository userRepositorySpy = spy(realRepository);
UserService userService = new UserService(userRepositorySpy);
User user = userService.getUserById(1);
// Проверка, что метод findById был вызван с параметром 1
verify(userRepositorySpy).findById(1);
// user будет содержать объект User, возвращенный реальным репозиторием
}
}
Отличия
- Stubs: Предоставляют предопределенные ответы, не проверяют взаимодействие.
- Mocks: Предоставляют предопределенные ответы и проверяют взаимодействие.
- Spies: Следят за вызовами методов реальных объектов, сохраняя их функциональность.
Эти инструменты помогают изолировать тестируемый код, обеспечивая надежность и предсказуемость тестов.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться