如何在junit中使用jdepend的JavaPackage.containsCycle()来检测我的包是否在包循环中?

时间:2011-09-02 13:28:53

标签: java testing package jdepend

我想通过 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中)?

1 个答案:

答案 0 :(得分:1)

以下解决方案一般不起作用,但作为解决方法:

不是检查树是否具有直接的包依赖性,而是通过p.containsCycle()检查间接包依赖性(即树是否导致包循环),但仅在以下代码之后:

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

这样,树所依赖的包(参见问题中列出的输出),但它们本身就具有循环,会被预先过滤掉。

缺点是如果导入新的包,可能必须将包添加到过滤器。并且您必须为不同的jdepend测试执行不同的设置,因为您不希望使用该过滤器来计算其他度量,例如距主序列的距离D.最后但并非最不重要的,如果树 - > yourFilteredPackage是直接循环的一部分,它不会被检测到:(