我有一個使用裏面的代理類來調用提供數據的服務的類。當然如果這個方法在裏面創建代理,那麼測試這個類是有問題的。你認爲代理應該在構造函數中給出,即使它可以在沒有「知道」的情況下創建嗎?構建一個可以測試的類
0
A
回答
1
您應該通過依賴注入(構造函數,屬性,參數)向類提供類依賴關係。這使得你的類可測試,並允許模擬所有這些依賴關係。
UPDATE: 進樣服務代理:
class Foo
{
private IServiceProxy _serviceProxy;
public Foo(IServiceProxy _serviceProxy)
{
_serviceProxy = serviceProxy;
}
public void Bar()
{
var staff = _serviceProxy.GetStaff();
}
}
順便說一句考慮隱瞞從你的類代理信息。例如。通過代理實現與實際服務相同的接口併爲您的課程提供IService。
UPDATE2(網關):
我們所有的域名需要 - 獲得一些工作人員。所以,我們定義接口:
interface IStaffService
{
Staff GetStaff();
}
我們的領域類(您的測試類只使用這個接口,並且不依賴於Web服務,代理創作和其他基礎設施問題)。
下一頁爲您服務創建網關(見Martin Fowler的網站定義):
public MyServiceProxyGateway : IStaffService
{
public Staff GetStaff()
{
var proxy = new YourProxyType();
proxy.X = value;
proxy.Y = value;
var response = proxy.CallActualServiceMethod();
Staff staff = new Staff();
staff.Value = response.Something;
return staff;
}
}
現在您的代碼完全不知道這一切的基礎設施的通信。你使用方便的接口GetStaff而不是CallActualServiceMethod。
1
那麼,「代理類知道如何實例化自己」和「類知道如何實例化代理類」之間有區別。第二,如果你把這些知識包裝在內部,單元測試就會變得更加困難(如果不是不可能的話)。我想使用依賴注入(通過框架,構造函數或屬性)將這些知識傳遞給調用者 - 並使其成爲可測試的。
1
爲了測試我的代理類,我通常給出了應該在構造函數中被代理的目標。可以給我一個存根對象進行測試的可能性。
public class MyProxy : IProxiedInterface
{
private IProxiedInterface _Target;
public MyProxy(IProxiedInterface target)
{
if(target == null)
throw new ArgumentNullException("target");
_Target = target;
}
// ToDo: Implement all functions from IProxiedInterface
// and delegate them to the target
public bool DoSomething()
{
return _Target.DoSomething();
}
}
相關問題
- 1. 是否可以創建一個單元測試來測試KeyListener的子類?
- 2. SAP類構建器中的類測試
- 3. 構建一個更可測試的會話管理器
- 4. 是否可以使用單個測試測試多個類
- 5. 測試類只能有一個構造
- 6. testNG測試類可以從另一個類擴展嗎?
- 7. 是否可以編寫一個可以測試AuthorizationPolicy對象的測試?
- 8. 重構靜態類,所以我可以單元測試它
- 9. 設計一個可以在if語句中測試的類?
- 10. 爲Java創建一個測試器類
- 11. 製作一個類可測試
- 12. 測試一個類可序列化
- 13. 構建Gson的一個實例,可以使子類充氣
- 14. 您可以在WPF中構建一個類似Visual Studio的DockPanel
- 15. 測試jQuery構建
- 16. 測試表格symfony中,以構建
- 17. 我可以爲django測試建立一個數據庫嗎?
- 18. 創建一個新的線程錯誤「類測試構造測試不能被應用到給定類型」
- 19. 無法添加構建以測試內部測試器
- 20. 測試一個構造函數實例化另一個類
- 21. 我可以爲外部服務(iPhone)構建單元測試嗎?
- 22. 如何重構類,以便可測試沒有反射
- 23. 一個結構體可以在類內部創建嗎?
- 24. JQuery可以構建類似DevExpress的UI
- 25. 創建一個測試集線器,以便用戶可以觸發並觀察運行的Selenium RC測試
- 26. 何處移動構建一次性依賴關係以提高可測試性?
- 27. 你可以調試在IntelliJ sbt構建
- 28. 從另一個測試類調用測試類的方法
- 29. 測試類可以有屬性嗎?
- 30. ,我可以寫一個測試,以迫使下面的代碼
邏輯,但你說如果一個類使用某種代理它可靠,所以它應該被注入? – guyl 2012-03-27 08:38:20
當然,你的測試中不應該有任何真實的代碼(除了測試對象)。因爲當測試失敗時,您將無法分辨出您的班級故障或者服務代理中的某些內容。當然,考慮環境問題 - 處理網絡和數據庫不是你想測試的東西:)如果你想測試代理,寫它的集成測試。 – 2012-03-27 08:46:13
請解釋「Btw考慮隱藏你的類的代理信息的含義,例如通過代理實現相同的接口來實現實際服務,併爲你的類提供IService。」我無法理解 – guyl 2012-03-27 08:52:11