如何使用jdepend';在junit中使用JavaPackage.containsCycle()来检测我的包是否处于包周期中?
我想在junit中通过jdepend测试我的包如何使用jdepend';在junit中使用JavaPackage.containsCycle()来检测我的包是否处于包周期中?,java,testing,package,jdepend,Java,Testing,Package,Jdepend,我想在junit中通过jdepend测试我的包tree是否在包周期上(即具有直接循环依赖性)。目前,它不是(参见下面的输出,jdepend的Eclipse插件没有找到树的循环)。但jdepend手册中建议的以下断言失败了: // setup.... JavaPackage p = jdepend.getPackage("tree"); System.out.println(p.getName() + "'s efferent packages: "); for (Object jp : p.ge
tree
是否在包周期上(即具有直接循环依赖性)。目前,它不是(参见下面的输出,jdepend的Eclipse插件没有找到树的循环)。但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中)?以下解决方案通常不起作用,但作为一种解决方法:
不检查tree是否具有直接的包依赖关系,而是通过p.containsCycle()
检查间接的包依赖关系(即tree是否导致包周期),但仅在以下代码之后:
final PackageFilter filter = new PackageFilter();
jdepend.setFilter(filter);
filter.addPackage("org.hamcrest");
这样,树所依赖的包(请参见问题中列出的输出),但它们本身具有周期,会被预先过滤掉
缺点是,如果导入新的包,可能必须将包添加到筛选器中。您必须为不同的jdepend测试执行不同的设置,因为您不想使用该过滤器计算其他指标,例如与主序列的距离D。最后但并非最不重要的一点是,如果tree->yourFilteredPackage是直接循环的一部分,则不会被检测到:(