首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArchUnit大小写不敏感名称匹配

ArchUnit大小写不敏感名称匹配
EN

Stack Overflow用户
提问于 2020-01-07 09:57:55
回答 1查看 820关注 0票数 1

我正在尝试使用Arch设置测试,以测试我的命名约定,遵循官方例子

看起来ArchUnit的命名断言是区分大小写的,这让我很困扰。

我想测试包domain.service中没有一个类包含单词service

给定一个类domain.service.FileSystemService

  • 此测试通过:
代码语言:javascript
复制
 @ArchTest
  val domain_service_should_not_have_names_containing_service: ArchRule =
    noClasses()
      .that().resideInAPackage("..domain.service..")
      .should().haveSimpleNameContaining("service")
  • 此测试失败:
代码语言:javascript
复制
 @ArchTest
  val domain_service_should_not_have_names_containing_service: ArchRule =
    noClasses()
      .that().resideInAPackage("..domain.service..")
      .should().haveSimpleNameContaining("Service")

我是不是遗漏了什么?有没有办法使ArchUnit的比较大小写不敏感?

EN

回答 1

Stack Overflow用户

发布于 2020-08-25 07:31:20

如果您不想像注释中建议的那样使用haveNameMatching,您也可以创建自己的ArchCondition

代码语言:javascript
复制
  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();
  }

你可以这样使用它:

代码语言:javascript
复制
  rules.add(noClasses().that().resideInAPackage("..domain.service..").should(containName("Service")));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59626058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档