gpt4 book ai didi

java - 如何创建 ArchUnit 规则来验证从特定自定义异常继承的所有异常?

转载 作者:行者123 更新时间:2023-12-04 09:03:40 25 4
gpt4 key购买 nike

我的架构规则之一是应用程序代码抛出的所有异常必须是 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 中编写规则返回每个调用构造函数的代码单元的正确方法是什么?

最佳答案

我认为你只需要结合你已经拥有的部分。以下代码对我有用:

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))) .

关于java - 如何创建 ArchUnit 规则来验证从特定自定义异常继承的所有异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63506602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com