Как игнорировать классы в тестовом классе с 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>");