Ответ
В тестировании часто приходится работать с копиями объектов, чтобы изолировать тесты и избежать побочных эффектов. Основные подходы:
-
Поверхностное копирование (Shallow Copy): Копируются только свойства первого уровня. Вложенные объекты передаются по ссылке.
- Когда использовать: Для простых объектов-значений (DTO) без вложенных структур.
- Пример в Java (с использованием конструктора копирования):
public class User { private String name; private int id; // Конструктор копирования для поверхностного копирования public User(User other) { this.name = other.name; this.id = other.id; } } // В тесте: User original = new User("Alice", 1); User copyForTest = new User(original);
-
Глубокое копирование (Deep Copy): Рекурсивно копируется весь объект, включая все вложенные объекты. Создается полностью независимая копия.
- Когда использовать: Для сложных объектов с вложенными коллекциями или другими объектами, когда тест должен модифицировать копию, не затрагивая оригинал.
- Способы реализации:
- Ручная реализация через конструктор глубокого копирования.
- Сериализация/десериализация (например, через
ObjectOutputStreamиObjectInputStream, но требуетSerializable). - Использование библиотек (например, Apache Commons Lang
SerializationUtils.clone()).
-
Копирование через фабричные методы или Builder:
- Практика: Создание объектов для тестов через специальные фабричные методы (например,
TestUserFactory.createDefaultUser()) или Builder-паттерн. Это не копирование в чистом виде, но стандартный способ получения изолированных тестовых данных.
- Практика: Создание объектов для тестов через специальные фабричные методы (например,
Ключевой принцип для QA: Выбор метода зависит от цели теста. Для модульных тестов, проверяющих логику, часто достаточно поверхностной копии или фабрики. Для интеграционных тестов, работающих с состоянием, может потребоваться глубокое копирование.