Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建ArchUnit规则来验证从特定自定义异常继承引发的所有异常?_Java_Unit Testing_Archunit - Fatal编程技术网

Java 如何创建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

我的体系结构规则之一是,应用程序代码引发的所有异常必须是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);
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))