如何在junit中使用jdepend的JavaPackage.containsCycle()来检测我的软件包是否在软件包周期中?
问题描述:
我想通过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)?
答
以下解决方案不一般的工作,但作为一种解决方法:
而不是检查树是否有直接的包依赖的,你做检查间接包的依赖(即树是否导致包装循环)通过p.containsCycle()
,但下面的代码后才:
final PackageFilter filter = new PackageFilter();
jdepend.setFilter(filter);
filter.addPackage("org.hamcrest");
这样的话,那棵树取决于封装(见问题列出的输出),但有自己的,预先过滤掉循环。
缺点是如果您导入新的包,则可能必须将包添加到过滤器。而且你必须针对不同的jdepend-tests做不同的设置,因为你不想使用该过滤器来计算其他度量,比如与主序列的距离,D.最后但并非最不重要,如果tree - > yourFilteredPackage是part直接循环,它不会被检测到:(