Как вы управляете фиктивными данными, используемыми для тестов?Держать их с соответствующими лицами?В отдельном тестовом проекте?Загрузить их с помощью сериализатора из внешних ресурсов?Или просто воссоздать их там, где это необходимо?
У нас есть стек приложений с несколькими модулями в зависимости от другого, каждый из которых содержит объекты.Каждый модуль имеет свои собственные тесты и нуждается в фиктивных данных для работы.
Теперь модулю, который имеет много зависимостей, потребуется много фиктивных данных из других модулей.Тем не менее, они не публикуют свои фиктивные объекты, потому что они являются частью тестовых ресурсов, поэтому все модули должны настраивать все фиктивные объекты, которые им нужны снова и снова.
Кроме того: большинство полей в наших сущностях не могут быть обнулены, поэтому даже работаюттранзакции с объектным уровнем требуют, чтобы они содержали какое-то значение, чаще всего с дополнительными ограничениями, такими как уникальность, длина и т. д.
Есть ли лучший выход из этого или все компромиссы решений?
Подробнее
Наш стек выглядит примерно так:
Один модуль:
src/main/java --> gets jared (.../entities/*.java contains the entities)
src/main/resources --> gets jared
src/test/java --> contains dummy object setup, will NOT get jared
src/test/resources --> not jared
Мы используем Maven для обработкизависимости.
пример модуля:
- Модуль A имеет несколько фиктивных объектов
- Модуль B нужны свои собственные объекты И так же, как и модуль A
Опция a)
A Тестовый модуль T может содержать все фиктивные объекты и предоставлять их в тестовой области (так чтоЗависимости ded не попадают под сомнение) на все тесты во всех модулях.Будет ли это работать?Значение: если я загружу T в A и запусту установку на A , то она НЕ будет содержать ссылки, введенные T , особенно не B ?Однако тогда A узнает о B модели данных.
Опция b)
Модуль A предоставляет фиктивные объекты где-то в src/main/java../entities/dummy
, что позволяет B получить их, в то время как A не знает о фиктивных данных B
Опция c)
Каждый модуль содержит внешние ресурсы, которые являются сериализованными фиктивными объектами.Они могут быть десериализованы тестовой средой, которая нуждается в них, потому что она зависит от модуля, к которому они принадлежат.Это потребует от каждого модуля создания и сериализации своих фиктивных объектов, хотя и как это сделать?Если с другим модульным тестом он вводит зависимости между модульными тестами, которые никогда не должны выполняться, или с помощью скрипта, его будет трудно отлаживать, и он не будет гибким.
Опция d)
Используйте макет фреймворка и присвойте необходимые поля вручную для каждого теста по мере необходимости.Проблема здесь в том, что большинство полей в наших объектах не обнуляются и поэтому требуют вызова сеттеров или конструкторов, что в конечном итоге приведет нас к началу.
Что мы не делаемwant
Мы не хотим создавать статическую базу данных со статическими данными, поскольку структура требуемых объектов будет постоянно меняться.Много прямо сейчас, немного позже.Поэтому мы хотим, чтобы hibernate настроил все таблицы и столбцы и заполнил их данными во время модульного тестирования.Также статическая база данных привнесет много потенциальных ошибок и взаимозависимостей тестов.
Мои мысли движутся в правильном направлении?Как лучше всего работать с тестами, которые требуют много данных?У нас будет несколько взаимозависимых модулей, которым потребуются объекты, заполненные какими-то данными из нескольких других модулей.
EDIT
Еще немного информации о том, как мы делаем это прямо сейчас, в ответ на второй ответ:
Итак, для простоты у нас есть три модуля: Person
, Product
, Order
.Person
протестирует некоторые методы менеджера с использованием объекта MockPerson
:
(в person / src / test / java :)
public class MockPerson {
public Person mockPerson(parameters...) {
return mockedPerson;
}
}
public class TestPerson() {
@Inject
private MockPerson mockPerson;
public testCreate() {
Person person = mockPerson.mockPerson(...);
// Asserts...
}
}
Класс MockPerson
не будет упакован.
То же самое относится к тестам продукта:
(в product / src / test / java :)
public class MockProduct() { ... }
public class TestProduct {
@Inject
private MockProduct mockProduct;
// ...
}
MockProduct
требуется, но не будет упаковано.
Теперь для тестирования заказов потребуются MockPerson
и MockProduct
, поэтому сейчас нам нужно создать оба, а также MockOrder
для проверки Order
.
(в порядке / src / test / java :)
Это дубликаты , и их нужно будет менять каждый раз, когда Person
или Product
меняет
public class MockProduct() { ... }
public class MockPerson() { ... }
Это единственный класс, который должен быть здесь:
public class MockOrder() { ... }
public class TestOrder() {
@Inject
private order.MockPerson mockPerson;
@Inject
private order.MockProduct mockProduct;
@Inject
private order.MockOrder mockOrder;
public testCreate() {
Order order = mockOrder.mockOrder(mockPerson.mockPerson(), mockProduct.mockProduct());
// Asserts...
}
}
Проблема в том, что теперь мы должны обновлять person.MockPerson
и order.MockPerson
всякий раз, когда Person
изменяется.
Не лучше ли просто публиковать Mocks с помощью jar, чтобы любой другой тест, имеющий зависимость, мог просто вызвать Mock.mock и получить красивый объект установки? Или это темная сторона - легкий путь?