ArchUnit - сопоставление имен без учета регистра

Я пытаюсь настроить тесты с Arch Unit, чтобы проверить свои соглашения об именах, следуя официальным примерам.

Кажется, что утверждения об именовании 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 нечувствительными к регистру?

1 ответ

Если вы не хотите использовать 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("contains '" + namePart + "' in the name");
          this.namePart = namePart;
      }

      @Override
      public void check(JavaClass javaClass, ConditionEvents events) {
          if (javaClass.getSimpleName().toLowerCase().contains(namePart.toLowerCase())) {
              String message = createCheckMessage(javaClass, "contains '" + namePart + "' in the name");
              events.add(new SimpleConditionEvent(javaClass, false, 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(classes().that().resideInAPackage("..domain.service..").should(containName("Service")));
Другие вопросы по тегам