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

标签 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() 检查是否有一个 reachable 包循环(即树是否有间接循环依赖)。

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

最佳答案

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

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

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

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

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

关于java - 我如何在junit 中使用jdepend 的JavaPackage.containsCycle() 来检测我的包是否处于包周期中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7284130/

相关文章:

java - JUnit5如何识别并执行可运行方法?

java - 尝试实现自定义列表适配器时应用程序崩溃(NullPointerException)

unit-testing - 使用 ActiveSupport::TestCase 进行事件管理 Controller 测试

package - 昆德尔 Julia 错误

java - `p12` 文件在 Firefox RestClient 中有效,但在 WebSphere 中无效

mysql - 如何搭建SQL测试环境?

ruby-on-rails - Rspec should_receive 在一个没有行为的实例上

java - 如何在不创建大量指向旧包的完全指定链接的情况下在 IntelliJ 中复制包

Python 导入、路径、目录和模块

java - 如何处理不同viewModel之间的通信?