java - 是否可以检查方法是否在一组类中声明?
问题描述
我正在使用 ArchUnit,我想检查一个包中的所有类是否都声明了一个唯一的公共方法,称为execute
. 我有这个代码:
JavaClasses importedClasses = new ClassFileImporter().importPackages("my.package");
methods().that().arePublic().should().haveName("execute").check(importedClasses);
execute
它可以工作,但是当任何类中没有方法时,我希望这个测试失败。使用我的代码,测试通过,因为所有公共方法(零)实际上都有名称“执行”。
解决方案
为了测试类,您必须ArchRule
基于它们(而不是基于可能不存在的方法)。您可以使用自定义条件来计算公共方法并测试它们的名称,例如:
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));
}
});
推荐阅读
- node.js - Expressjs 服务器和外部 api 调用
- javascript - Formspree 表单在提交时提醒两次
- python - “列表”对象没有属性“_meta”
- python - PyQt5 来自 apt install python3-pyqt5
- python - 拖放小部件实现错误 - RuntimeWarning:MetaObjectBuilder::addMethod:为“dropped”提供的方法签名无效
- android - 使用 switchpreferenceCompat 设置活动
- excel - 为excel vba中的单元格分配约束
- azure - 从 Azure AD B2C 自定义策略加密数据的最佳方式
- mysql - 尝试执行过程时,我不断收到 MySQL 错误 #1054
- ruby - 有人可以指出我正确的方向,但引导我提出问题,问自己为我的硬件解决这个错误