如何解决如何创建ArchUnit规则以验证从特定自定义异常继承的所有异常?
我的体系结构规则之一是,应用程序代码引发的所有异常必须是CustomException或CustomException的子类。
我很难在ArchUnit中编写此规则。我目前所拥有的是:
private static final ArchCondition<JavaClass> THROWS_NON_CUSTOM_EXCEPTION = callCodeUnitWhere(
target(is(constructor()))
.and(
originOwner(
is(assignableTo(Throwable.class))
.and(not(assignableTo(CustomException.class)))
)
)
);
@ArchTest public static final ArchRule noNonCustomExceptions = noClasses()
.should(THROWS_NON_CUSTOM_EXCEPTION);
运行此规则将返回true(JUnit测试通过),即使我的代码抛出的异常也不是CustomException。
我已经测试了规则中检测到构造函数具有可分配给Throwable的所有者的部分:
private static final ArchCondition<JavaClass> THROWS_NON_CUSTOM_EXCEPTION =
callCodeUnitWhere(
target(is(constructor()))
.and(
originOwner(
is(assignableTo(Throwable.class))
)
)
);
这将正确返回代码中创建任何Throwable的每个位置。
问题似乎出在我的代码中,该代码试图查找无法分配给CustomException的所有者:
private static final ArchCondition<JavaClass> THROWS_NON_CUSTOM_EXCEPTION = callCodeUnitWhere(
target(is(constructor()))
.and(
originOwner(
is(not(assignableTo(CustomException.class)))
)
)
);
这将返回每个构造函数,甚至包括那些可分配给CustomException的异常的构造函数。
在ArchUnit中编写一条规则以返回每个调用构造函数的代码单元的正确方法是什么?该构造函数的所有者可分配给Throwable,而 not 可分配给CustomException?
解决方法
我认为您只需要合并已经拥有的部分。以下代码对我有用:
noClasses().should().callCodeUnitWhere(
JavaCall.Predicates.target(
AccessTarget.Predicates.constructor()
.and(AccessTarget.Predicates.declaredIn(JavaClass.Predicates.assignableTo(Throwable.class)))
.and(DescribedPredicate.not(AccessTarget.Predicates.declaredIn(JavaClass.Predicates.assignableTo(BaseException.class))))
)
);
如果您的BaseException
处于分析范围内,则需要排除该类:noClasses().that(not(belongToAnyOf(BaseException.class)))
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。