我想使用ArchUnit来强制只使用SLF4J测井框架并避免简单的System.out调用。此外,我希望避免使用任何其他日志记录框架。我怎样才能执行这样的检查?
目前我写了这个测试
class EnforceSlf4JLoggingTest {
private final JavaClasses importedClasses = new ClassFileImporter()
.withImportOption(new ImportOption.DoNotIncludeTests())
.importPackages("... my packages ...");
@Test
public void classesShouldNotUseJavaUtilLogging() {
NO_CLASSES_SHOULD_USE_JAVA_UTIL_LOGGING.check(importedClasses);
}
@Test
public void classesShouldNotUseSystemOutLogging() {
noClasses()
.should()
.dependOnClassesThat()
.belongToAnyOf(java.lang.System.class)
.because("use SLF4J instead")
.check(importedClasses);
}
}但它实际上并不强制使用SLF4J,而只是限制java.unit.logging的使用,并防止依赖于java.lang.System类(实际上是System.out常量所在的地方)。
是否更优雅地解决了我的问题?
发布于 2021-03-16 16:27:44
除了SLF4J之外,没有简单的方法可以避免使用任何其他的日志系统,但是可以使用这个ArchUnit检查模板
ArchRuleDefinition.noClasses()
.should().dependOnClassesThat()
.resideInAnyPackage(
"java.util.logging..",
"org.apache.logging.."
).as("Please only depend on SLF4J as a logging framework");在本节中,应该指定resideInAnyPackage,必须避免使用不同日志记录系统的包。
还有,规则
com.tngtech.archunit.library.GeneralCodingRules.NO_CLASSES_SHOULD_ACCESS_STANDARD_STREAMS 必须用于检查代码中任何普通的System.out、System.err和printStackTrace调用。
https://stackoverflow.com/questions/66653647
复制相似问题