Archunit 检查方法调用

Sim*_*lli 4 archunit

我有一个类,它具有三个不应从某些类调用的方法。

我如何使用 Archunit 检查这一点?

例如

public class Foo {

   public void method1() {
   }

   public void method2() {
   }

   public void method3() {
   }
}
Run Code Online (Sandbox Code Playgroud)

method1 和 method2 只能由类 Bar1 和 Bar2 调用。

Man*_*red 6

import com.tngtech.archunit.lang.ArchRule;

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
import static com.tngtech.archunit.lang.conditions.ArchConditions.callMethod;
Run Code Online (Sandbox Code Playgroud)

您可以使用

import com.tngtech.archunit.lang.ArchRule;

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
import static com.tngtech.archunit.lang.conditions.ArchConditions.callMethod;
Run Code Online (Sandbox Code Playgroud)


Wim*_*uwe 5

我有一个非常相似的要求并提出了这个:

@ArchTest
    public static final ArchRule rule = noClasses()
            .that(not(name(Bar1.class.getName()))
                          .and(not(name(Bar2.class.getName()))))
            .should().callMethodWhere(target(nameMatching("method1"))
                                              .and(target(owner(assignableTo(Foo.class)))))
            .orShould().callMethodWhere(target(nameMatching("method2"))
                                              .and(target(owner(assignableTo(Foo.class)))));
Run Code Online (Sandbox Code Playgroud)

我还没有测试过,但我认为应该很接近。

编辑:进口是:

import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;

import static com.tngtech.archunit.base.DescribedPredicate.not;
import static com.tngtech.archunit.core.domain.JavaCall.Predicates.target;
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.assignableTo;
import static com.tngtech.archunit.core.domain.properties.HasName.Predicates.name;
import static com.tngtech.archunit.core.domain.properties.HasName.Predicates.nameMatching;
import static com.tngtech.archunit.core.domain.properties.HasOwner.Predicates.With.owner;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
Run Code Online (Sandbox Code Playgroud)