#archunit
#archunit
Вопрос:
Есть ли возможность исключить определенный класс из многоуровневого тестового условия в ArchUnit-test?
У меня есть пакеты A, B, C, D, определенные следующим образом:
<root>
- A <-- contains a factory class referring to B, C and D.
-B
-C
-D
Пакет A содержит служебные и базовые классы, которые используются и расширяются классами в пакетах B, C и D.
Таким образом, правило должно заключаться в том, что классы в A не должны ссылаться ни на что в расширяющихся пакетах, ЗА ИСКЛЮЧЕНИЕМ того, что в A есть фабричный класс, который ссылается на кучу конечных классов в B, C, D. Так что фабричный класс должен быть исключен из этого теста.
ArchRule rule = Architectures.layeredArchitecture()
.layer("A").definedBy("..a")
.layer("B").definedBy("..a.b..")
.layer("C").definedBy("..a.c..")
.layer("D").definedBy("..a.d..")
.whereLayer("A").mayOnlyBeAccessedByLayers("B", "C", "D", ... and others ...)
.whereLayer("B").mayNotBeAccessedByAnyLayer() // except by "FactoryClass" in A
.whereLayer("C").mayNotBeAccessedByAnyLayer() // except by "FactoryClass" in A
.whereLayer("D").mayNotBeAccessedByAnyLayer() // except by "FactoryClass" in A
Как можно сформулировать, что «за исключением FactoryClass в» -условии в ArchUnit?
Надеюсь, я смог прояснить ситуацию…
Ответ №1:
Уровни вашей архитектуры не обязательно должны соответствовать пакетам 1: 1.
Вы могли бы использовать .layer("A").definedBy(DescribedPredicate<? super JavaClass>)
для исключения FactoryClass
из слоя A.
В качестве альтернативы, вы, вероятно, могли бы сохранить его на уровне A, но использовать LayeredArchitecture.ignoreDependency
для исключения его зависимостей.