我正在尝试使用Arch设置测试,以测试我的命名约定,遵循官方例子。
看起来ArchUnit的命名断言是区分大小写的,这让我很困扰。
我想测试包domain.service中没有一个类包含单词service。
给定一个类domain.service.FileSystemService
@ArchTest
val domain_service_should_not_have_names_containing_service: ArchRule =
noClasses()
.that().resideInAPackage("..domain.service..")
.should().haveSimpleNameContaining("service") @ArchTest
val domain_service_should_not_have_names_containing_service: ArchRule =
noClasses()
.that().resideInAPackage("..domain.service..")
.should().haveSimpleNameContaining("Service")我是不是遗漏了什么?有没有办法使ArchUnit的比较大小写不敏感?
发布于 2020-08-25 07:31:20
如果您不想像注释中建议的那样使用haveNameMatching,您也可以创建自己的ArchCondition。
public static ArchCondition<JavaClass> containName(String namePart) {
return new NameContains(namePart);
}
private static class NameContains extends ArchCondition<JavaClass> {
private String namePart;
NameContains(String namePart) {
super("contain '" + namePart + "' in the name");
this.namePart = namePart;
}
@Override
public void check(JavaClass javaClass, ConditionEvents events) {
boolean containsName = javaClass.getSimpleName().toLowerCase().contains(namePart.toLowerCase());
String message;
if (containsName) {
message = createCheckMessage(javaClass, "contains '" + namePart + "' in the name");
} else {
message = createCheckMessage(javaClass, "does not contain '" + namePart + "' in the name");
}
events.add(new SimpleConditionEvent(javaClass, containsName, message));
}
}
// taken from com.tngtech.archunit.lang.conditions.ArchConditions
public static <T extends HasDescription & HasSourceCodeLocation> String createCheckMessage(T object,
String message) {
return object.getDescription() + " " + message + " in " + object.getSourceCodeLocation();
}你可以这样使用它:
rules.add(noClasses().that().resideInAPackage("..domain.service..").should(containName("Service")));https://stackoverflow.com/questions/59626058
复制相似问题