Как использовать jdepend JavaPackage.containsCycle() в junit, чтобы определить, находится ли мой пакет в цикле пакета?
Я хочу проверить в junit через jdepend ли мой пакет tree
находится в цикле пакета (то есть имеет прямую циклическую зависимость). В настоящее время это не так (см. Вывод ниже, а плагин jdepend для Eclipse не находит цикл для tree
). Но утверждение ниже, предложенное в руководстве jdepend, не выполняется:
// setup....
JavaPackage p = jdepend.getPackage("tree");
System.out.println(p.getName() + "'s efferent packages: ");
for (Object jp : p.getEfferents()) {
System.out.println(((JavaPackage) jp).getName());
}
assertThat(p.containsCycle(), is(false));
Выход:
tree's efferent packages:
java.util
java.lang
java.lang.reflect
java.util.logging
java.io
org.hamcrest
Причина, по которой утверждение не выполняется, заключается в том, что containsCycle()
рекурсивно вызывает getEfferents(), помещает полученные пакеты в список и возвращает true
если какой-то пакет уже в нем. Так containsCycle()
проверяет, существует ли достижимый цикл пакета (т. е. имеет ли дерево косвенную циклическую зависимость).
Но как я могу протестировать только прямые циклические зависимости, т.е. находится ли дерево в цикле пакета (а не в том, что оно приводит к некоторому другому циклу пакета, например, в org.hamcrest)?
1 ответ
Следующее решение не работает вообще, но как обходной путь:
Вместо того, чтобы проверять, имеет ли дерево прямую зависимость от пакета, вы проверяете косвенную зависимость от пакета (т. Е. Приводит ли дерево к циклу пакета) через p.containsCycle()
, но только после следующего кода:
final PackageFilter filter = new PackageFilter();
jdepend.setFilter(filter);
filter.addPackage("org.hamcrest");
Таким образом, пакеты, от которых зависит это дерево (см. Вывод, перечисленный в вопросе), но которые сами имеют циклы, отфильтровываются заранее.
Недостатком является то, что вам, возможно, придется добавить пакеты в фильтр, если вы импортируете новые. И вам придется делать разные настройки для разных jdepend-тестов, потому что вы не хотите использовать этот фильтр для вычисления других метрик, таких как расстояние от главной последовательности, D. Последнее, но не менее важное, если дерево -> yourFilteredPackage является частью прямого цикла, он не будет обнаружен:(