我想通过 jdepend 在junit中测试我的包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()
检查是否存在可到达包循环(即树是否具有间接循环依赖性)。
但是我怎样才能测试直接的循环依赖关系,即树是否 on 一个包循环(而不是,它会导致其他一些包循环,例如在org.hamcrest中)?
答案 0 :(得分:1)
以下解决方案一般不起作用,但作为解决方法:
不是检查树是否具有直接的包依赖性,而是通过p.containsCycle()
检查间接包依赖性(即树是否导致包循环),但仅在以下代码之后:
final PackageFilter filter = new PackageFilter();
jdepend.setFilter(filter);
filter.addPackage("org.hamcrest");
这样,树所依赖的包(参见问题中列出的输出),但它们本身就具有循环,会被预先过滤掉。
缺点是如果导入新的包,可能必须将包添加到过滤器。并且您必须为不同的jdepend测试执行不同的设置,因为您不希望使用该过滤器来计算其他度量,例如距主序列的距离D.最后但并非最不重要的,如果树 - > yourFilteredPackage是直接循环的一部分,它不会被检测到:(