如何在ArchUnit分层架构测试中排除Java基础功能依赖?
解决ArchUnit分层架构规则排除Java基础类的方法
你可以通过两种方式解决这个问题,要么直接忽略JDK基础包的依赖检查,要么只关注自定义分层之间的依赖关系:
方法一:忽略JDK基础包的依赖
在测试代码中添加ignoreDependency规则,排除对java.*、javax.*等JDK核心包的依赖检查:
@Test void layeredArchitectureTest() { Architectures.layeredArchitecture() .consideringAllDependencies() // 忽略所有JDK基础包的依赖 .ignoreDependency(packageMatches("java..*"), any()) .ignoreDependency(any(), packageMatches("java..*")) .ignoreDependency(packageMatches("javax..*"), any()) .ignoreDependency(any(), packageMatches("javax..*")) .layer("Presentation").definedBy(PACKAGE_PREFIX + ".presentation..") .layer("Service").definedBy(PACKAGE_PREFIX + ".service..") .layer("Domain").definedBy(PACKAGE_PREFIX + ".domain..") .layer("Infrastructure").definedBy(PACKAGE_PREFIX + ".infrastructure..") .whereLayer("Presentation").mayOnlyAccessLayers("Service", "Domain", "Infrastructure") .whereLayer("Infrastructure").mayOnlyBeAccessedByLayers("Service", "Domain", "Presentation") .whereLayer("Service").mayOnlyAccessLayers("Domain", "Infrastructure") .whereLayer("Domain").mayNotAccessAnyLayer() .check(classes); }
packageMatches("java..*")会匹配所有java开头的子包(包括java.util、java.lang等),ArchUnit将不再检查这些包的依赖是否符合分层规则。
方法二:只检查自定义分层间的依赖
如果你的规则仅需要约束自己定义的四个分层,把consideringAllDependencies替换为consideringOnlyDependenciesInLayers,这样ArchUnit会自动忽略所有外部包(包括JDK)的依赖,只关注你定义的层内部和层之间的关系:
@Test void layeredArchitectureTest() { Architectures.layeredArchitecture() .consideringOnlyDependenciesInLayers() // 替换原有的consideringAllDependencies .layer("Presentation").definedBy(PACKAGE_PREFIX + ".presentation..") .layer("Service").definedBy(PACKAGE_PREFIX + ".service..") .layer("Domain").definedBy(PACKAGE_PREFIX + ".domain..") .layer("Infrastructure").definedBy(PACKAGE_PREFIX + ".infrastructure..") .whereLayer("Presentation").mayOnlyAccessLayers("Service", "Domain", "Infrastructure") .whereLayer("Infrastructure").mayOnlyBeAccessedByLayers("Service", "Domain", "Presentation") .whereLayer("Service").mayOnlyAccessLayers("Domain", "Infrastructure") .whereLayer("Domain").mayNotAccessAnyLayer() .check(classes); }
这种方式更简洁,适合不需要关心外部依赖约束的场景。
内容的提问来源于stack exchange,提问作者Maevy
相关产品推荐
相关产品推荐

