Barney
Barney

Reputation: 915

ArchUnit classes should depend only on particular classes from a package

I have two separate packages:

mycomp.sales
- Order
- OrderPlaced
mycom.delivery
- Delivery
- OrderPlacedListener (depends on mycomp.sales.OrderPlaced)

I want to set a rule which checks that the package mycom.delivery has only a dependency on OrderPlaced and no other classes in the package mycomp.sales.

So far I came up with this:

JavaClasses importedClasses = new ClassFileImporter().importPackages("mycomp.delivery");
ArchRule rule = classes()
        .should().onlyDependOnClassesThat().resideOutsideOfPackages("mycomp.sales..")
        .orShould().onlyDependOnClassesThat().areAssignableTo(OrderPlaced.class);
rule.check(importedClasses);

But this fails on the OrderPlacedListener (which has a dependency to mycomp.sales.OrderPlaced).

How to do this?

Upvotes: 1

Views: 2504

Answers (1)

ttulka
ttulka

Reputation: 10882

In your code both OR clauses are evaluated separately, it means either 1. all dependencies must be outside mycomp.sales.. (which is not) or 2. all dependencies must be assignable to OrderPlaced (which is obviously not).

You have to define a compound rule like that:

ArchRule rule = classes()
    .should().onlyDependOnClassesThat(
        resideOutsideOfPackages("mycomp.sales..")
            .or(type(OrderPlaced.class)));

Upvotes: 3

Related Questions