2011-09-02 33 views
0

我想通過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)?

回答

1

以下解決方案不一般的工作,但作爲一種解決方法:

而不是檢查樹是否有直接的包依賴的,你做檢查間接包的依賴(即樹是否導致包裝循環)通過p.containsCycle(),但下面的代碼後才:

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

這樣的話,那棵樹取決於封裝(見問題列出的輸出),但有自己的,預先過濾掉循環。

缺點是如果您導入新的包,則可能必須將包添加到過濾器。而且你必須針對不同的jdepend-tests做不同的設置,因爲你不想使用該過濾器來計算其他度量,比如與主序列的距離,D.最後但並非最不重要,如果tree - > yourFilteredPackage是part直接循環,它不會被檢測到:(

相關問題