Цель: закрепить слоистую архитектуру правилами-как-код, чтобы нарушения ловились тестом, а не на ревью.
Зависимость: INIT-1, INIT-6.
Что сделать
- Подключи
com.tngtech.archunit:archunit-junit5 и опиши правила под реальную структуру пакетов com.warehouse:
@AnalyzeClasses(packages = "com.warehouse")
class ArchitectureTest {
@ArchTest static final ArchRule layers = layeredArchitecture().consideringOnlyDependenciesInLayers()
.layer("Controller").definedBy("..controller..")
.layer("Service").definedBy("..service..")
.layer("Repository").definedBy("..repository..")
.whereLayer("Controller").mayNotBeAccessedByAnyLayer()
.whereLayer("Repository").mayOnlyBeAccessedByLayers("Service");
}
- Добавь правила: entity не утекают в контроллеры (контроллеры возвращают только
dto); контроллеры зависят на сервисы, не на репозитории; нейминг (*Controller, *Service, *Repository, *Specification).
- Трудные места: правила должны отражать фактическую раскладку пакетов, а не идеальную; решить, разрешён ли
mapper/specification доступ к entity; не ловить ложные срабатывания на Spring-инфраструктуре.
Acceptance criteria
Цель: закрепить слоистую архитектуру правилами-как-код, чтобы нарушения ловились тестом, а не на ревью.
Зависимость: INIT-1, INIT-6.
Что сделать
com.tngtech.archunit:archunit-junit5и опиши правила под реальную структуру пакетовcom.warehouse:dto); контроллеры зависят на сервисы, не на репозитории; нейминг (*Controller,*Service,*Repository,*Specification).mapper/specificationдоступ к entity; не ловить ложные срабатывания на Spring-инфраструктуре.Acceptance criteria