Я писал ранее о (анти) шаблонах в зависимостях пакетов . И, конечно, постоянный читатель моего блога знает о 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 . |