gpt4 book ai didi

java - ArchUnit 似乎没有缓存分析的类

转载 作者:行者123 更新时间:2023-12-02 18:57:46 31 4
gpt4 key购买 nike

我使用 Jupiter 编写了一些 ArchUnit 测试。我发现一些示例表明,您可以使用非静态方法编写 ArchUnit 测试,例如:

@Test
void enforceExceptionNames() {
classes().that()
.areAssignableTo(Exception.class)
.and(modifier(PUBLIC))
.and().areNotAnnotatedWith("some.qa.ExceptionNameFlaw")
.should()
.haveNameMatching(".*Exception").orShould()
.haveNameMatching(".*Error")
.check(modulClasses);
}

优点是,您可以执行不可能静态的操作 - 例如在运行时使用反射提取包名等。

但是性能很差。大约 1-10 秒,具体取决于大小。

无论哪种方式,ArchUnit 都会声明所有类都静态缓存。

最佳答案

您最初的问题没有显示如何获取modulClasses。如果你这样做

class StandardCodeModuleTest {

private final JavaClasses modulClasses = new ClassFileImporter().import...

然后,(昂贵的)类文件导入通常会为每个测试完成(参见 @TestInstance ),而不需要缓存。

所以是的,使用ArchUnit's support for JUnit是完全有意义的。与@AnalyzeClasses,如 you found 。但是,@ArchTest 并不限于静态 字段或方法。您还可以使用非静态方法:

@ArchTest
void enforceExceptionNames(JavaClasses modulClasses) {
classes().that()
.areAssignableTo(Exception.class)
.and(modifier(PUBLIC))
.and().areNotAnnotatedWith("some.qa.ExceptionNameFlaw")
.should()
.haveNameMatching(".*Exception").orShould()
.haveNameMatching(".*Error")
.check(modulClasses);
}

或非静态ArchRule定义:

@ArchTest
ArchRule enforceExceptionNames = classes()
.that()
.areAssignableTo(Exception.class)
.and(modifier(PUBLIC))
.and().areNotAnnotatedWith("some.qa.ExceptionNameFlaw")
.should()
.haveNameMatching(".*Exception").orShould()
.haveNameMatching(".*Error");

关于java - ArchUnit 似乎没有缓存分析的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65951425/

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