0

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などの他のパッケージサイクルにつながるかどうか)はどうでしょうか。

4

1 に答える 1

1

次の解決策は一般的には機能しませんが、回避策として:

ツリーに直接のパッケージ依存関係があるかどうかをチェックする代わりに、間接的なパッケージ依存関係 (つまり、ツリーがパッケージ サイクルにつながるかどうか) をチェックしますがp.containsCycle()、それは次のコードの後でのみです。

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

そのようにして、ツリーが依存するパッケージ (質問にリストされている出力を参照) が、それ自体にサイクルがあるパッケージは、事前に除外されます。

欠点は、新しいパッケージをインポートする場合、フィルターにパッケージを追加する必要がある場合があることです。また、メイン シーケンス D からの距離などの他のメトリックを計算するためにそのフィルターを使用したくないため、さまざまな jdepend-tests に対してさまざまなセットアップを行う必要があります。直接サイクルの場合、検出されません:(

于 2011-09-02T15:14:25.327 に答える