jdependtree
を介してjunitで、パッケージがパッケージサイクルにあるかどうか(つまり、直接循環依存関係があるかどうか)をテストしたいと思います。現在、そうではありません(以下の出力を参照してください。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などの他のパッケージサイクルにつながるかどうか)はどうでしょうか。