我正在尝试使用ArchUnit进行单元测试,以检查是否有任何未使用的类。但我不知道如何检查 MyClass.class 是否引用了某个类。
例如我有一堂课:
public class MyClass {
...
}
Run Code Online (Sandbox Code Playgroud)
然后我用某种方法引用这个类:
public class MySecondClass{
public void methodA(){
methodThatTakesClassAsParameter(MyClass.class);
}
...
}
Run Code Online (Sandbox Code Playgroud)
如何从 ArchUnit 中看到 MyClass 是从 MySecondClass 引用的?
我可能会给你一个(部分)解决方案。
创建一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
使用ArchCondition
ArchCondition<JavaClass> notBeUnreferenced = new NotBeUnreferenced();
ArchRule rule = classes().should(notBeUnreferenced);
collectedRules.add(rule);
Run Code Online (Sandbox Code Playgroud)
你可能想要
@EJB, @Dependent, )@Statelessrule = rule.or(ArchConditions.beAnnotatedWith(...))已知的限制
请注意,如果唯一的访问是编译单元(类、接口、枚举),则该编译单元被视为未引用。
.class和其他反射访问| 归档时间: |
|
| 查看次数: |
1058 次 |
| 最近记录: |