← Назад ко всем вопросам

Что такое 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: Следят за вызовами методов реальных объектов, сохраняя их функциональность.

Эти инструменты помогают изолировать тестируемый код, обеспечивая надежность и предсказуемость тестов.

Тема: JavaScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки