首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArchUnit似乎不缓存已分析的类

ArchUnit似乎不缓存已分析的类
EN

Stack Overflow用户
提问于 2021-01-29 16:57:02
回答 2查看 117关注 0票数 2

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

代码语言:javascript
复制
@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都会声明所有类都被静态缓存。

EN

回答 2

Stack Overflow用户

发布于 2021-01-29 17:01:17

只有在使用@AnalyzeClasses和@ArchTest带注释的静态字段或方法时,It semms缓存才会发生。

在将我的测试转换为此模式后,性能飙升至0.05秒!

代码语言:javascript
复制
@AnalyzeClasses(packages = "some.svc.gui.impl")
public class StandardCodeModuleTest extends StandardCodeTest {

    @ArchTest
    public static final ArchRule ENFORCE_EXCEPTION_NAMES = classes()
            .that()
            .areAssignableTo(Exception.class)
            .and(modifier(PUBLIC))
            .and().areNotAnnotatedWith("some.qa.ExceptionNameFlaw")
            .should()
            .haveNameMatching(".*Exception").orShould()
            .haveNameMatching(".*Error");
票数 2
EN

Stack Overflow用户

发布于 2021-02-11 15:36:43

您最初的问题没有说明modulClasses是如何获得的。如果你这样做了

代码语言:javascript
复制
class StandardCodeModuleTest {

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

则(昂贵的)类文件导入将-通常(参见@TestInstance) -对每个测试都这样做,没有缓存。

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

代码语言:javascript
复制
@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定义:

代码语言:javascript
复制
@ArchTest
ArchRule enforceExceptionNames = classes()
             .that()
             .areAssignableTo(Exception.class)
             .and(modifier(PUBLIC))
             .and().areNotAnnotatedWith("some.qa.ExceptionNameFlaw")
             .should()
             .haveNameMatching(".*Exception").orShould()
             .haveNameMatching(".*Error");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65951425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档