Java 如何创建ArchUnit规则来验证从特定自定义异常继承引发的所有异常?
我的体系结构规则之一是,应用程序代码引发的所有异常必须是CustomException或CustomException的子类 我很难用ArchUnit编写此规则。我目前的情况如下:Java 如何创建ArchUnit规则来验证从特定自定义异常继承引发的所有异常?,java,unit-testing,archunit,Java,Unit Testing,Archunit,我的体系结构规则之一是,应用程序代码引发的所有异常必须是CustomException或CustomException的子类 我很难用ArchUnit编写此规则。我目前的情况如下: private static final ArchCondition<JavaClass> THROWS_NON_CUSTOM_EXCEPTION = callCodeUnitWhere( target(is(constructor())) .and( originO
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);
private static final ArchCondition抛出非自定义异常=callCodeUnitWhere(
目标(是(构造函数())
.及(
原创者(
是(可分配给(可丢弃的类))
.和(不是(可分配给(CustomException.class)))
)
)
);
@ArchTest公共静态最终ArchRule noNonCustomExceptions=noClasses()
.should(抛出非自定义异常);
运行此规则将返回true(JUnit测试通过),即使我的代码抛出的异常也不是CustomException
我已经测试了规则的一部分,该部分检测到构造函数具有可分配给Throwable的所有者:
private static final ArchCondition<JavaClass> THROWS_NON_CUSTOM_EXCEPTION =
callCodeUnitWhere(
target(is(constructor()))
.and(
originOwner(
is(assignableTo(Throwable.class))
)
)
);
private static final ArchCondition抛出非自定义异常=
callCodeUnitWhere(
目标(是(构造函数())
.及(
原始所有者(
是(可分配给(可丢弃的类))
)
)
);
这将正确返回代码中创建任何可丢弃项的每个位置
问题似乎出在我的代码中,它试图找到不可分配给CustomException的所有者:
private static final ArchCondition<JavaClass> THROWS_NON_CUSTOM_EXCEPTION = callCodeUnitWhere(
target(is(constructor()))
.and(
originOwner(
is(not(assignableTo(CustomException.class)))
)
)
);
private static final ArchCondition抛出非自定义异常=callCodeUnitWhere(
目标(是(构造函数())
.及(
原始所有者(
是(不是(可分配给(CustomException.class)))
)
)
);
这将返回每个构造函数,甚至是可分配给CustomException的异常的构造函数
在ArchUnit中,编写规则返回调用构造函数的每个代码单元的正确方法是什么?该构造函数的所有者可分配给Throwable,而不可分配给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
位于分析的范围内,则需要排除该类:noclass()。该类(不属于任何(BaseException.class))