Я писал ранее о (анти) шаблонах в зависимостях пакетов . И, конечно, постоянный читатель моего блога знает о Degraph , моем частном проекте по визуализации зависимостей пакетов, который может очень помочь, когда вы попытаетесь идентифицировать и исправить такие антипаттерны.
Но вместо того, чтобы решить проблему, мы все, вероятно, предпочли бы предотвратить проблему в первую очередь. Поэтому в последней версии Degraph появилась новая функция: DSL для тестирования зависимостей.
Вы можете писать тесты либо в Scala, либо в Java, что бы ни подходило для вашего проекта.
Типичный тест, написанный с помощью ScalaTest, выглядит следующим образом:
1
2
3
4
5
6
7
|
classpath // analyze everything found in the current classpath .including( "de.schauderhaft.**" ) // only the classes that start with "de.schauderhaft." .withSlicing( "module" , "de.schauderhaft.(*).**" ) // use the third part of the package name as the module name, and make sure the modules don't have cycles .withSlicing( "layer" , ( "persistence" , "de.schauderhaft.legacy.db.**" ), // consider everything in the package de.schauderhaft.legacy.db and subpackages as part of the layer "persistence" "de.schauderhaft.*.(*).**" ) // for everything else use the fourth part of the package name as the name of the layer ) should be(violationFree) // check for violations (i.e. dependency circles) |
Эквивалентный тестовый код в Java и JUnit выглядит следующим образом:
01
02
03
04
05
06
07
08
09
10
|
assertThat( classpath() // analyze everything found in the current classpath .including( "de.schauderhaft.**" ) // only the classes that start with "de.schauderhaft." .withSlicing( "module" , "de.schauderhaft.(*).**" ) // use the third part of the package name as the module name, and make sure the modules don't have cycles .withSlicing( "layer" , new NamedPattern( "persistence" , "de.schauderhaft.legacy.db.**" ), // consider everything in the package de.schauderhaft.legacy.db and subpackages as part of the layer "persistence" "de.schauderhaft.*.(*).**" ) // for everything else use the fourth part of the package name as the name of the layer ), is(violationFree()) ); |
Вы также можете ограничить зависимость разных срезов друг от друга. Например:
1
2
3
|
… .withSlicing( "module" , "de.schauderhaft.(*).**" ).allow(oneOf( "order" , "reporting" ), "customer" , "core" ) … |
Означает:
- материал в
de.schauderhaft.order
может зависеть отde.schauderhaft.customer
иde.schauderhaft.core
- то же самое верно для
de.schauderhaft.reporting
-
de.schauderhaft.customer
может зависеть отde.schauderhaft.core
- все другие зависимости между этими пакетами запрещены
- пакеты от и до других пакетов разрешены
Если вы также хотите разрешить зависимости между срезом order
и reporting
срезом, замените oneOf
на anyOf
.
Если вы хотите запретить зависимости от reporting
или order
core
вы можете заменить allow
на allowDirect
.
См. Официальную документацию для получения более подробной информации, особенно обо всех вариантах, которые предлагает DSL , необходимом импорте и о том, как настроить Degraph для тестирования.
Я пытаюсь включить Degraph в Maven Central, чтобы упростить использование внутри проектов.
У меня также есть некоторые изменения в тестовом DSL в моем списке дел. И, наконец, я работаю над интерфейсом на основе HTML5. Так что следите за обновлениями.
Ссылка: | Проверьте свои зависимости с Degraph от нашего партнера JCG Йенса Шаудера в блоге Schauderhaft . |