Ваш первоначальный подход, кроме дублирования, использует один антипаттерн: вы вызываете assertAll
, но все же все утверждения помещаете в один блок. Таким образом, после первого ошибочного утверждения выполнение блока будет прекращено. Если вместо этого вы поместите каждую отдельную проверку в один Executable
, в случае сбоя будут выполнены все проверки, и вы получите более подробную информацию о том, что не удалось, а что нет. Конечно, это больше не проблема с подходом сравнения строк.
Что касается дублирования, есть еще одна идея, как вы могли бы избежать его в данном конкретном случае, то есть для тестов двух функций преобразования: вы могли бы использовать тот факт, что преобразование между двумя типами выполняется туда и обратно. это функция идентичности:
Address address = getAddress();
AddressDTO addressDTO = addressMapper.addressToAddressDTO(address);
Address actual = addressMapper.addressDTOtoAddress(addressDTO);
assertEquals(address, actual);
Это исключает сравнение отдельных элементов. Может быть даже выгодно, если представление сущности и DTO изменяются таким образом, что атрибуты больше не являются строго равными, а вместо этого должны быть только конвертируемыми назад и вперед.
Но каждый тест теперь также основан на других методах тестируемого класса. В общем, это не проблема: многие тесты, например, полагаются на работу конструктора - что нормально, если есть тесты для конструктора. Здесь, однако, если тест не пройден, есть два возможных местоположения, которые несут ответственность, и поэтому поиск виновного требует дополнительного анализа.
Относительно второго варианта, который вы пробовали, а именно создания строк и сравнения их: в некоторых сценариях такой подход может быть полезным, но в целом я не решаюсь переходить от структурированных данных к строкам. Предположим, вы создали много тестов, используя этот шаблон. Позже, однако, вы понимаете, что в DTO некоторые атрибуты должны быть закодированы иначе, чем в сущности (я упоминал этот сценарий выше). Внезапно преобразование в строки больше не работает или становится неловким.
С подходом строк или без него: Если у вас есть больше утверждений, где нужно сравнивать полные объекты и DTO, я бы рекомендовал написать ваши собственные вспомогательные методы утверждений, такие как assertEntityMatchesDto
и assertDtoMatchesEntity
.
Последнее замечание: могут быть причины не сравнивать все атрибуты объектов в одном тесте. Таким образом, тесты могут быть недостаточно сфокусированными. Возьмем пример изменения кодировки снова. Представьте, что вам придется изменить представление адреса электронной почты в DTO в какой-то момент времени. Затем, если вы всегда просматриваете все атрибуты в своих тестах, все ваши тесты не пройдут. Если вместо этого вы сфокусировали тесты для отдельных атрибутов, такое изменение, если оно выполнено правильно, повлияет только на тесты с фокусом на атрибут электронной почты, но оставит другие тесты без изменений.