Поиск неиспользуемых классов в ArchUnit, как найти ссылку на MyClass.class?

Я пытаюсь сделать модульный тест с ArchUnit, чтобы проверить, есть ли у меня неиспользуемые классы. Но я не могу понять, как проверить, есть ли ссылка на какой-либо класс с помощью MyClass.class.

Например, у меня есть класс:

public class MyClass {
    ...
}

Затем я ссылаюсь на этот класс в некотором методе:

public class MySecondClass{
    public void methodA(){
        methodThatTakesClassAsParameter(MyClass.class);
    }
    ...
}

Как я могу видеть из ArchUnit, что MyClass ссылается из MySecondClass?

0 ответов

У меня может быть (частичное) решение для вас.

Создать ArchCondition

  public static class NotBeUnreferenced extends ArchCondition<JavaClass> {

      NotBeUnreferenced() {
          super("is not referenced by any other compilation units");
      }

      @Override
      public void check(JavaClass javaClass, ConditionEvents events) {
          Set<JavaAccess<?>> accessesFromOtherCompilationUnits = new HashSet<JavaAccess<?>>();
          accessesFromOtherCompilationUnits.addAll(javaClass.getAccessesToSelf());
          accessesFromOtherCompilationUnits.removeAll(javaClass.getAccessesFromSelf());

          if (accessesFromOtherCompilationUnits.isEmpty() && javaClass.getDirectDependenciesToSelf().isEmpty()) {
              String message = createCheckMessage(javaClass, "is unreferenced");
              events.add(new SimpleConditionEvent(javaClass, false, message));
          }
      }

      // taken from com.tngtech.archunit.lang.conditions.ArchConditions
      public static <T extends HasDescription & HasSourceCodeLocation> String createCheckMessage(T object,
              String message) {
          return object.getDescription() + " " + message + " in " + object.getSourceCodeLocation();
      }
  }

Использовать ArchCondition

  ArchCondition<JavaClass> notBeUnreferenced = new NotBeUnreferenced();
  ArchRule rule = classes().should(notBeUnreferenced);
  collectedRules.add(rule);

Вы можете захотеть

  • исключить классы с определенными аннотациями (например, @EJB, @Dependent, @Stateless) добавлением условия или (rule = rule.or(ArchConditions.beAnnotatedWith(...)))
  • исключить код из тестовых классов
  • исключить классы и интерфейсы, которые отображают только константы

Известные ограничения

Обратите внимание, что единица компиляции (класс, интерфейс, перечисление) считается не имеющей ссылки, если единственный доступ

  • доступ к .class и другой светоотражающий доступ
  • доступ к константе (то есть статическому конечному полю)
Другие вопросы по тегам