Как использовать 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 является частью прямого цикла, он не будет обнаружен:(

Другие вопросы по тегам