Дублирование данных (Data Clones)

Тестовые объекты (User, Address, Order) создаются вручную с одинаковыми значениями в каждом тест-классе или тест-методе. Любое изменение модели требует правки в десятках мест.

Симптомы

  • Одинаковые конструкторы new User("Ivan", "Petrov", "ivan@test.com", ...) в нескольких тест-файлах
  • Копипаста блоков создания объектов между классами
  • При изменении конструктора модели — компиляционная ошибка в 20+ местах
  • Нет классов *Factory, *Builder, *Mother в тестовом коде

Причины возникновения

  • Каждый тест писался отдельно без мысли о переиспользовании
  • «Проще скопировать, чем абстрагировать»
  • Отсутствие договорённости о тестовых фабриках в команде
  • Торопливость: создание фабрики кажется лишними затратами времени

Почему это проблема

  • Хрупкость к изменениям модели: добавили обязательное поле в User — нужно обновить 30 тестов
  • Несогласованность данных: в тесте A пользователь с email ivan@test.com, в тесте B — тот же email, конфликт в БД
  • Неуникальность: захардкоженный email нарушает уникальный constraint при параллельном запуске
  • Трудно найти все места: grep по строке покажет не всё из-за вариаций в форматировании

Решение

Централизованные фабрики с разумными дефолтами и уникальными значениями:

// ❌ копипаста в каждом тесте
User user = new User("Ivan", "Petrov", "ivan@test.com", "+79990000001");

// ✅ фабрика с уникальным email
public static User defaultUser() {
    return User.builder()
        .firstName("Ivan").lastName("Petrov")
        .email("ivan+" + UUID.randomUUID() + "@test.com")
        .build();
}