Поиск неиспользуемых классов в 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
и другой светоотражающий доступ - доступ к константе (то есть статическому конечному полю)