是否可以检查方法是否在一组 类 中声明?
Is it possible to check if method is declared in a group of classes?
我正在使用 ArchUnit,我想检查包中的所有 classes 是否只声明了一个 public 方法 execute
。我有这个代码:
JavaClasses importedClasses = new ClassFileImporter().importPackages("my.package");
methods().that().arePublic().should().haveName("execute").check(importedClasses);
它可以工作,但我希望当 execute
方法在任何 class 中不存在时该测试失败。使用我的代码,测试通过了,因为所有 public 方法(零)实际上都具有名称“execute”。
为了测试 类,您必须将 ArchRule
基于它们(而不是基于可能不存在的方法)。您可以使用 custom condition 来计算 public 方法并测试它们的名称,例如像这样:
ArchRule rule = classes()
.that().resideInAPackage("my.package")
.should(new ArchCondition<JavaClass>("have exactly one public method named 'execute'") {
@Override
public void check(JavaClass javaClass, ConditionEvents events) {
List<JavaMethod> publicMethods = javaClass.getMethods().stream()
.filter(javaMethod -> javaMethod.getModifiers().contains(PUBLIC))
.collect(toList());
boolean satisfied = false;
String message = javaClass.getName() + " contains " + publicMethods.size() + " public method";
if (publicMethods.size() == 1) {
JavaMethod method = publicMethods.get(0);
satisfied = method.getName().equals("execute");
message += " named '" + method.getName() + "' " + method.getSourceCodeLocation();
} else {
message += "s " + javaClass.getSourceCodeLocation();
}
events.add(new SimpleConditionEvent(javaClass, satisfied, message));
}
});
我正在使用 ArchUnit,我想检查包中的所有 classes 是否只声明了一个 public 方法 execute
。我有这个代码:
JavaClasses importedClasses = new ClassFileImporter().importPackages("my.package");
methods().that().arePublic().should().haveName("execute").check(importedClasses);
它可以工作,但我希望当 execute
方法在任何 class 中不存在时该测试失败。使用我的代码,测试通过了,因为所有 public 方法(零)实际上都具有名称“execute”。
为了测试 类,您必须将 ArchRule
基于它们(而不是基于可能不存在的方法)。您可以使用 custom condition 来计算 public 方法并测试它们的名称,例如像这样:
ArchRule rule = classes()
.that().resideInAPackage("my.package")
.should(new ArchCondition<JavaClass>("have exactly one public method named 'execute'") {
@Override
public void check(JavaClass javaClass, ConditionEvents events) {
List<JavaMethod> publicMethods = javaClass.getMethods().stream()
.filter(javaMethod -> javaMethod.getModifiers().contains(PUBLIC))
.collect(toList());
boolean satisfied = false;
String message = javaClass.getName() + " contains " + publicMethods.size() + " public method";
if (publicMethods.size() == 1) {
JavaMethod method = publicMethods.get(0);
satisfied = method.getName().equals("execute");
message += " named '" + method.getName() + "' " + method.getSourceCodeLocation();
} else {
message += "s " + javaClass.getSourceCodeLocation();
}
events.add(new SimpleConditionEvent(javaClass, satisfied, message));
}
});