Как исключить класс из правила 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())

Другая возможность - явно объявить часть исходного кода, отвечающую за запуск приложения (пакет "пользователи"), как добросовестный уровень и интегрировать его в ваши правила. В конце концов, именно так вы хотите, чтобы ваш исходный код работал, поэтому мне интересно, стоит ли делать исключение.

Другие вопросы по тегам