2017-08-11 47 views
2

我的目標是列出項目的公共API類的所有傳遞依賴項,並使用它來集中測試工作以防止發生任何代碼更改到那些依賴關係。查找Java類的所有傳遞依賴項,包括僅通過其接口使用的實現類

例如:

class MyApi { 
    MyDao md; 
    public void methodA() { 
     //do something with md; 
    } 
} 

interface MyDao { } 

class MyDaoImpl implements MyDao { } 

所以,如果我知道MyDaoImpl已被修改(比如從提交歷史),我知道MyApi.methodA使用MyDaoImpl,然後我的測試應重點檢查它。我需要MyApi.methodA()的依賴項列表,包括MyDao和MyDaoImpl。

到目前爲止,我已經嘗試了兩種工具 - https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.htmlhttp://depfind.sourceforge.net/ - 它們很有前途,但似乎並未完全解決問題。對於這兩種工具,似乎如果一個類依賴於一個接口,就沒有內建的方式將該接口的實現包含爲傳遞依賴。

有沒有一種方法可以從任何工具中獲取這些信息而不需要大量定製?

+0

你應該在你的方法中加入'md = new MyDaoImpl()'。否則'MyDaoImpl'沒有連接到你的應用程序。 – Nathan

+0

實際的代碼使用spring來注入實現類,所以確實沒有新的MyDaoImpl()。我正在尋找一些方法來吸引MyApi正在使用的所有接口實現,即使沒有直接在代碼中創建。 – ab2000

回答

1

您可以使用JArchitect來滿足您的需求。 右鍵單擊的方法在任何地方的用戶界面,然後選擇菜單:選擇方法...> ...正在使用我的(直接或間接)導致代碼查詢,如:

from m in Methods 
let depth0 = m.DepthOfIsUsing("myNamespace.MyClass.MyMethod()") 
where depth0 >= 0 orderby depth0 
select new { m, depth0 } 

的問題是這樣的查詢給出了間接使用,但不尋找通過接口(或在基類中聲明的重寫方法)發生的調用

希望你問了能與此查詢獲得:

// Retrieve the target method by name 
let methodTarget = Methods.WithFullName(""myNamespace.MyClass.MyMethod()"").Single() 

// Build a ICodeMetric<IMethod,ushort> representing the depth of indirect 
// call of the target method. 
let indirectCallDepth = 
    methodTarget.ToEnumerable() 
    .FillIterative(
     methods => methods.SelectMany(
      m => m.MethodsCallingMe.Union(m.OverriddensBase))) 

from m in indirectCallDepth.DefinitionDomain 
select new { m, callDepth = indirectCallDepth[m] } 

兩個此查詢的基石是:

  • 到FillIterative()的調用遞歸選擇間接呼叫。顧名思義,對屬性IMethod.OverriddensBase的調用是
  • 。對於方法M這將返回在基類或接口中聲明的所有方法的枚舉,由M覆蓋。
+0

謝謝James,JArchitect查詢似乎按照我的預期工作。 – ab2000

相關問題