0

我想通过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()检查是否存在可达包循环(即树是否有间接循环依赖)。

但是我怎样才能只测试直接循环依赖,即树是否一个包循环中(而不是它导致一些其他的包循环,例如在 org.hamcrest 中)?

4

1 回答 1

1

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

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

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

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

不利的一面是,如果您导入新的包,您可能必须将包添加到过滤器中。而且您必须为不同的 jdepend-tests 进行不同的设置,因为您不想使用该过滤器来计算其他指标,例如与主序列的距离 D。最后但并非最不重要的一点是,如果 tree -> yourFilteredPackage 是一部分的直接循环,它不会被检测到:(

于 2011-09-02T15:14:25.327 回答