Как исключить класс из правила ArchUnit? - PullRequest
1 голос
/ 10 января 2020

При создании правила для многоуровневой архитектуры в ArchUnit мне не ясно, как исключить отдельный класс (Main). Базовый пример исключает источник и цель.

... но я не понимаю, как это конвертируется в мои потребности. Я просто хочу, чтобы просто Майн игнорировали. Почему? Поскольку Main ссылается на все слои, поскольку он внедряет все зависимости на месте.

Исходный код находится в моем GitHub вместе с ошибочным тестом . (проект фиктивный, поэтому его легко запустить; просто клонируйте его, запустите тесты и увидите, что один провалился).

Ответы [ 3 ]

0 голосов
/ 11 января 2020

Как насчет этого:

.ignoreDependency(fullNameMatching("users.WebAppConfig"), alwaysTrue())
0 голосов
/ 26 января 2020

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

0 голосов
/ 11 января 2020

Предположим, что вы импортировали все свои классы:

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 (внутренние классы, анонимные классы, lambdas et c.) Вы можете настроить фильтр:

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);
...