Недавно мы столкнулись с некоторым конфликтом при разработке нашей системы. Мы обнаружили, что у нас есть 3 разных подхода к тестированию в нашей команде, и нам нужно решить, какой из них лучше, и проверить, нет ли ничего лучше этого.
Сначала давайте посмотрим правде в глаза:
- в системе есть 3 уровня данных (DTO, доменные объекты, таблицы)
- мы используем картографы, созданные с помощью mapstruct для отображения объектов каждого слоя на другой
- мы используем mockito
- мы проводим юнит-тестирование каждого из наших слоев
Теперь конфликт: давайте предположим, что мы хотим протестировать ExampleService
, который использует ExampleModelMapper
для сопоставления ExampleModel
с ExampleModelDto
и выполняет некоторую дополнительную бизнес-логику, которая требует тестирования. Мы можем проверить правильность возвращаемых данных тремя различными способами:
a) Мы можем вручную сравнить каждое поле возвращаемого объекта с ожидаемым результатом:
assertThat(returnedDto)
.isNotNull()
.hasFieldOrPropertyWithValue("id", expectedEntity.getId())
.hasFieldOrPropertyWithValue("address", expectedEntity.getAddress())
.hasFieldOrPropertyWithValue("orderId", expectedEntity.getOrderId())
.hasFieldOrPropertyWithValue("creationTimestamp", expectedEntity.getCreationTimestamp())
.hasFieldOrPropertyWithValue("price", expectedEntity.getPrice())
.hasFieldOrPropertyWithValue("successCallbackUrl", expectedEntity.getSuccessCallbackUrl())
.hasFieldOrPropertyWithValue("failureCallbackUrl", expectedEntity.getFailureCallbackUrl())
б) Мы можем использовать реальный маппер (как в обычной логике) для сравнения двух объектов:
assertThat(returnedDto).isEqualToComparingFieldByFieldRecursivly(mapper.mapToDto(expectedEntity)))
в) И, наконец, мы можем смоделировать маппер и его ответ:
final Entity entity = randomEntity();
final Dto dto = new Dto(entity.getId(), entity.getName(), entity.getOtherField());
when(mapper.mapToDto(entity)).thenReturn(dto);
Мы хотим, чтобы тесты были как можно лучше, сохраняя их эластичность и устойчивость к изменениям. Мы также хотим придерживаться принципа СУХОЙ.
Мы рады услышать любые советы, комментарии, плюсы и минусы каждого метода. Мы также открыты для просмотра любых других решений.
Привет.