2011-09-02 34 views
0

我想通过jdepend来测试我的软件包tree是否为封装周期(即具有直接循环依赖性)。目前,它不是(见下面的输出,并且jdepend的Eclipse插件没有找到tree的周期)。但断言下方,建议在jdepend手册,失败:如何在junit中使用jdepend的JavaPackage.containsCycle()来检测我的软件包是否在软件包周期中?

// 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 

的断言失败是​​递归调用getEfferents()的原因,把所得封装中一个列表并返回true如果某个软件包已经在其中。因此,​​检查是否存在可用的包周期(即,树是否具有间接循环依赖性)。

但我怎么能只测试直接循环依赖,即树是否是包周期(而不是,这导致了一些其他的包周期,例如在org.hamcrest)?

回答

1

以下解决方案不一般的工作,但作为一种解决方法:

而不是检查树是否有直接的包依赖的,你做检查间接包的依赖(即树是否导致包装循环)通过p.containsCycle(),但下面的代码后才:

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

这样的话,那棵树取决于封装(见问题列出的输出),但有自己的,预先过滤掉循环。

缺点是如果您导入新的包,则可能必须将包添加到过滤器。而且你必须针对不同的jdepend-tests做不同的设置,因为你不想使用该过滤器来计算其他度量,比如与主序列的距离,D.最后但并非最不重要,如果tree - > yourFilteredPackage是part直接循环,它不会被检测到:(

相关问题