我用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都会声明所有类都被静态缓存。
发布于 2021-01-29 17:01:17
只有在使用@AnalyzeClasses和@ArchTest带注释的静态字段或方法时,It semms缓存才会发生。
在将我的测试转换为此模式后,性能飙升至0.05秒!
@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");发布于 2021-02-11 15:36:43
您最初的问题没有说明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");https://stackoverflow.com/questions/65951425
复制相似问题