Как использовать jdepend JavaPackage.containsCycle () в junit, чтобы определить, находится ли мой пакет в цикле пакета? - PullRequest
0 голосов
/ 02 сентября 2011

Я хочу проверить в 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 Ответ

1 голос
/ 02 сентября 2011

Следующее решение не работает вообще, но как обходной путь:

Вместо проверки того, имеет ли дерево прямую зависимость от пакета, вы проверяете косвенную зависимость от пакета (т. Е. Приводит ли дерево к циклу пакета) через p.containsCycle(), но только после следующего кода:

    final PackageFilter filter = new PackageFilter();
    jdepend.setFilter(filter);
    filter.addPackage("org.hamcrest");

Таким образом, пакеты, от которых зависит это дерево (см. Вывод, указанный в вопросе), но которые имеют сами циклы, отфильтровываются заранее.

Недостатком является то, что вам, возможно, придется добавлять пакеты в фильтр, если вы импортируете новые. И вам придется делать разные настройки для разных jdepend-тестов, потому что вы не хотите использовать этот фильтр для вычисления других метрик, таких как расстояние от главной последовательности, D. Последнее, но не менее важное, если дерево -> yourFilteredPackage является частью прямого цикла, он не будет обнаружен: (

...