Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用jdepend';在junit中使用JavaPackage.containsCycle()来检测我的包是否处于包周期中?_Java_Testing_Package_Jdepend - Fatal编程技术网

如何使用jdepend';在junit中使用JavaPackage.containsCycle()来检测我的包是否处于包周期中?

如何使用jdepend';在junit中使用JavaPackage.containsCycle()来检测我的包是否处于包周期中?,java,testing,package,jdepend,Java,Testing,Package,Jdepend,我想在junit中通过jdepend测试我的包tree是否在包周期上(即具有直接循环依赖性)。目前,它不是(参见下面的输出,jdepend的Eclipse插件没有找到树的循环)。但jdepend手册中建议的以下断言失败了: // setup.... JavaPackage p = jdepend.getPackage("tree"); System.out.println(p.getName() + "'s efferent packages: "); for (Object jp : p.ge

我想在junit中通过jdepend测试我的包
tree
是否在包周期上(即具有直接循环依赖性)。目前,它不是(参见下面的输出,jdepend的Eclipse插件没有找到
树的循环)。但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中)?

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

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

    final PackageFilter filter = new PackageFilter();
    jdepend.setFilter(filter);
    filter.addPackage("org.hamcrest");
这样,树所依赖的包(请参见问题中列出的输出),但它们本身具有周期,会被预先过滤掉

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