Как исключить класс из правила ArchUnit?
При создании правила для многоуровневой архитектуры в ArchUnit мне непонятно, как исключить один класс (Main).Базовый пример исключает с источником и целью.
... но я не понимаю, как это приспособить к моим потребностям. Я просто хочу, чтобы игнорировали только Main. Почему? Поскольку Main ссылается на все слои, поскольку он вводит все зависимости на место.
Исходный код находится в моем GitHub вместе с неудачным тестом. (проект фиктивный, поэтому его просто запустить; просто клонируйте его, запустите тесты и увидите, что один из них не работает).
3 ответа
Предположим, вы импортировали все свои классы:
JavaClasses classes = new ClassFileImporter().importPackages("org.example");
Затем вы обычно проверяете все эти классы на соответствие ArchRule, независимо от того, является ли это правилом класса или правилом архитектуры:
ArchRule rule = classes()
.that().areAnnotatedWith(Service.class)
.should().haveSimpleNameEndingWith("Service");
rule.check(classes);
Чтобы исключить классы из правила, вы можете отфильтровать classes
и передать отфильтрованные JavaClasses
к правилу:
import static com.tngtech.archunit.base.DescribedPredicate.not;
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.equivalentTo;
import static com.tngtech.archunit.lang.conditions.ArchPredicates.are;
JavaClasses allExceptMain = classes.that(are(not(equivalentTo(Main.class))));
rule.check(allExceptMain);
Чтобы исключить класс Main
и все классы, которые определены внутри Main
(внутренние классы, анонимные классы, лямбды и т. д.) вы можете настроить фильтр:
import static com.tngtech.archunit.base.DescribedPredicate.not;
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.belongToAnyOf;
JavaClasses allExceptMain = classes.that(not(belongToAnyOf(Main.class)));
rule.check(allExceptMain);
Как насчет чего-то вроде этого:
.ignoreDependency(fullNameMatching("users.WebAppConfig"), alwaysTrue())
Другая возможность - явно объявить часть исходного кода, отвечающую за запуск приложения (пакет "пользователи"), как добросовестный уровень и интегрировать его в ваши правила. В конце концов, именно так вы хотите, чтобы ваш исходный код работал, поэтому мне интересно, стоит ли делать исключение.