使用archunit校验以"DTO"结尾的类只能被方法名以"Converter"结尾的方法作为入参和返回
时间: 2023-07-22 21:04:38 浏览: 156
C语言中send()函数和sendto()函数的使用方法
5星 · 资源好评率100%
你可以使用 ArchUnit 库来校验以"DTO"结尾的类是否只能被方法名以"Converter"结尾的方法作为入参和返回。以下是一个示例代码:
```java
import com.tngtech.archunit.lang.ArchRule;
import com.tngtech.archunit.library.Architectures;
import com.tngtech.archunit.library.dependencies.SlicesRuleDefinition;
import com.tngtech.archunit.library.freeze.FreezingArchRule;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
public class DTOConverterArchTest {
private static final String DTO_PACKAGE = "com.example.dto";
private static final String CONVERTER_PACKAGE = "com.example.converter";
public static final ArchRule dtoClassesShouldOnlyBeUsedByConverterMethods = classes()
.that().resideInAPackage(DTO_PACKAGE)
.should().onlyBeAccessed().byAnyPackage(CONVERTER_PACKAGE);
public static final ArchRule converterMethodsShouldOnlyUseDTOClasses = classes()
.that().haveSimpleNameEndingWith("Converter")
.should().onlyHaveDependentClassesThat().resideInAnyPackage(DTO_PACKAGE);
public static final ArchRule dtoClassesShouldOnlyBeUsedByConverterMethodsAsParametersOrReturnTypes =
FreezingArchRule.freeze(
SlicesRuleDefinition.slices().matching(DTO_PACKAGE + ".(*)..")
.should().notDependOnEachOther());
public static void main(String[] args) {
Architectures.LayeredArchitecture layeredArchitecture = Architectures.layeredArchitecture()
.layer("DTO").definedBy(DTO_PACKAGE)
.layer("CONVERTER").definedBy(CONVERTER_PACKAGE)
.whereLayer("DTO").mayNotBeAccessedByAnyLayer()
.whereLayer("CONVERTER").mayOnlyBeAccessedByLayers("DTO");
layeredArchitecture.check(dtoClassesShouldOnlyBeUsedByConverterMethods);
layeredArchitecture.check(converterMethodsShouldOnlyUseDTOClasses);
dtoClassesShouldOnlyBeUsedByConverterMethodsAsParametersOrReturnTypes.check();
}
}
```
以上代码定义了三个校验规则:
1. `dtoClassesShouldOnlyBeUsedByConverterMethods`:校验以"DTO"结尾的类只能被方法名以"Converter"结尾的方法访问。
2. `converterMethodsShouldOnlyUseDTOClasses`:校验方法名以"Converter"结尾的方法只能使用以"DTO"结尾的类。
3. `dtoClassesShouldOnlyBeUsedByConverterMethodsAsParametersOrReturnTypes`:校验以"DTO"结尾的类不应该相互依赖。
你可以根据实际情况,将包名 `com.example.dto` 和 `com.example.converter` 替换为你自己的包名。
阅读全文