ArchUnit: самый элегантный способ проверить, зависят ли пакеты друг от друга - PullRequest
1 голос
/ 22 марта 2019

У меня есть два пакета com.myapp.foo и com.myapp.bar, и я хочу знать, какой самый элегантный способ явно проверить, не зависят ли эти два пакета (и только те, которых есть еще com.myapp.XX) друг от друга.

Это то, что я сейчас имею (работает великолепно):

    SliceAssignment packagesFooAndBar = new SliceAssignment() {
        @Override
        public String getDescription() {
            return "foo and bar";
        }

        @Override
        public SliceIdentifier getIdentifierOf(JavaClass javaClass) {
            if (javaClass.getPackageName().startsWith("com.myapp.foo")) {
                return SliceIdentifier.of("foo");
            }
            if (javaClass.getPackageName().startsWith("com.myapp.bar")) {
                return SliceIdentifier.of("bar");
            }
            return SliceIdentifier.ignore();
        }
    };
    @ArchTest
    final ArchRule packagesFooAndBarNotDependOnEachOther = SlicesRuleDefinition
        .slices()
        .assignedFrom(packagesFooAndBar)
        .should()
        .notDependOnEachOther();

Есть ли более элегантный способ, может быть, без использования SliceAssignment?Спасибо!

1 Ответ

0 голосов
/ 22 июля 2019

Я бы, вероятно, использовал два правила.

@ArchTest
final ArchRule fooShouldNotDependOnBar = ArchRuleDefinition
.classes()
.that().resideInAnyPackage("com.myapp.foo")
.should().onlyDependOnClassesThat()
.resideOutsideOfPackage("com.myapp.bar");

@ArchTest
final ArchRule barShouldNotDependOnFoo = ArchRuleDefinition
.classes()
.that().resideInAnyPackage("com.myapp.bar")
.should().onlyDependOnClassesThat()
.resideOutsideOfPackage("com.myapp.foo");

Если вы хотите написать то же самое в одном правиле без пользовательских классов, должно работать следующее.Я не уверен, если бы я назвал это элегантным , так как это кажется немного сложным.Возможно, есть лучшие способы записать его в одном правиле.

@ArchTest
final ArchRule packagesFooAndBarNotDependOnEachOther = SlicesRuleDefinition
    .slices()
    .matching("com.myapp.(*)")
    .should()
    .notDependOnEachOther()
    .ignoreDependency(
        JavaClass.Predicates.resideOutsideOfPackages("com.myapp.foo", "com.myapp.bar"),
        DescribedPredicate.alwaysTrue())
    .ignoreDependency(
        DescribedPredicate.alwaysTrue(),
        JavaClass.Predicates.resideOutsideOfPackages("com.myapp.foo", "com.myapp.bar"))
    );

Правило сначала соответствует всем прямым подпакетам com.myapp.Первый ignoreDependency затем исключает все зависимости из классов вне заданных пакетов (например, для com.myapp.xx доступа com.myapp.foo).Второй ignoreDependency исключает все зависимости из данных пакетов для любого внешнего пакета (например, для com.myapp.foo доступа com.myapp.xx).

...