Тест уровня ArchUnit: как исключить определенный класс?

#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 для исключения его зависимостей.