Как игнорировать классы в тестовом классе с ArchUnit

Я написал свой первый тест ArchUnit:

import static com.tngtech.archunit.library.dependencies.SlicesRuleDefinition.*;
// more non-static imports

@RunWith(ArchUnitRunner.class)
@AnalyzeClasses(packages = "my.domain.project")
public class PackageStructureTests {

    @ArchTest public static final ArchRule NO_CYCLES = slices().matching("my.domain.project.(**)")
            .namingSlices("package:$1").should().beFreeOfCycles();

}

Проблема в том, что он также анализирует классы в тестах, которые не следуют этому простому ограничению зависимости.

Как ограничить тестирование "производственными" классами?

Проект создается с помощью Maven, поэтому классы находятся в отдельных каталогах.

Недостаточно разделять классы с именами, заканчивающимися на "Тесты" или чем-то еще, потому что есть много классов, которые не являются тестами, но присутствуют только в пути к классам тестов.

2 ответа

Решение

Похоже, что API не очень хорош в этом отношении, потому что вы не первый, кто интересуется этим (это также была проблема № 1 на Github https://github.com/TNG/ArchUnit/issues/1).

Чтобы ответить на вопрос, хотя, аннотация @AnalyseClasses имеет дополнительный атрибут importOption (в ArchUnit 0.5.0 это будет массив AND со всеми параметрами), который принимает произвольную реализацию ImportOptionгде вы можете указать, какие Location (в основном URI), чтобы включить.

Поскольку исключение тестов довольно распространено, это ImportOption уже предопределено (для Maven и Gradle < 4.0), так что вы можете написать

@AnalyzeClasses(..., importOption = ImportOption.DontIncludeTests.class)
public class MyTest{ ... }

Я не думаю, что есть универсальное решение для всех установок (таким образом, свобода просто написать свой собственный ImportOption решить, какие места включить). Однако для стандартных установок Maven и Gradle это должно работать.

Если вы не используете archunit-junit (JUnit4-поддержка ArchUnit как время написания), а используете "родной" ArchUnit, используйте (например)

final JavaClasses classes = new ClassFileImporter()
  .withImportOption(new ImportOption.DontIncludeTests())
  .importPackages("<some-package>");
Другие вопросы по тегам