Skip to content
IRC-CodingIRC-Coding
TestdoublesStubMockFakeSpyUnit Tests

Testdoubles: Stubs, Mocks, Fakes и Spys

Testdoubles объяснены: Stubs, Mocks, Fakes, Spys. Примеры использования, правила применения и тестовые вопросы.

S

schutzgeist

1 min read
Testdoubles: Stubs, Mocks, Fakes и Spys

Тестовые двойники: Stubs vs. Mocks vs. Fakes vs. Spys

Это материал содержит определения тестовых двойников с примерами экзаменационных вопросов и ключевыми терминами.

В двух словах

  • Stub: возвращает заранее определённые значения
  • Mock: проверяет взаимодействия и ожидания
  • Fake: упрощённая, но функциональная реализация
  • Spy: записывает вызовы для последующей проверки (комбинация Stub и Mock)

Определения

Stub

Возвращает фиксированные значения без проверки поведения. Подходит для тестов, где не важно состояние.

Mock

Проверяет, что определённые методы вызваны с нужными параметрами. Необходим, когда взаимодействие между компонентами критично.

Fake

Работающая, но упрощённая реализация (например, база данных в памяти). Полезен для unit-тестов, близких к интеграционным.

Spy

Сохраняет информацию о вызовах для проверки их позже (гибрид между Stub и Mock).

Ключевые моменты для экзамена

  • Stub: предопределённые ответы, без проверки поведения
  • Mock: определение и верификация ожиданий
  • Fake: функциональное упрощение (например, хранилище в памяти)
  • Spy: запись вызовов для последующей проверки
  • Когда использовать: Stub для состояния, Mock для поведения, Fake для сложности
  • Инструменты: Mockito, unittest.mock, Jest

Основные компоненты

  1. Stub (ответы)
  2. Mock (ожидания)
  3. Fake (упрощённая реализация)
  4. Spy (запись)
  5. Изоляция тестов
  6. Работа с фреймворками
  7. Setup/Teardown
  8. Assertions
  9. Верификация
  10. Поддержка кода

Практический пример (сервис скидок)

// Stub
DiscountPolicy stub = new DiscountPolicyStub(10); // всегда 10%
int rabatt = service.berechneRabatt(kunde, artikel);

// Mock
DiscountPolicy mock = mock(DiscountPolicy.class);
when(mock.getRabatt(kunde)).thenReturn(10);
verify(mock).getRabatt(kunde);

// Fake
InMemoryDiscountRepository fake = new InMemoryDiscountRepository();
fake.add(new Discount(kunde, 10));

// Spy
DiscountPolicySpy spy = new DiscountPolicySpy();
service.berechneRabatt(kunde, artikel);
assertEquals(1, spy.getCallCount());

Типичные экзаменационные вопросы (с кратким ответом)

  1. В чём разница между Stub и Mock? Stub возвращает ответы, Mock проверяет вызовы.
  2. Когда использовать Fake? Когда нужна функциональная упрощённая реализация (например, база данных в памяти).
  3. Что делает Spy? Записывает вызовы и позволяет проверить их позже.

Основные источники

  1. https://martinfowler.com/articles/mocksArentStubs.html
  2. https://junit.org/junit5/docs/current/user-guide/
  3. https://testing.googleblog.com
Назад к блогу
Share:

Nächster Artikel in Качество ПО

Weiterlesen
BDD: Behavior Driven Development для команд

Похожие статьи