簡體   English   中英

使用EasyMock測試構造另一個對象的方法

[英]Using EasyMock to test a method that constructs another object

我有這樣的方法:

public void MyMethod(int p1, int p2) {
  //some logic here
  MyObject mo = new MyObject(var1,var2);
  int returnedId = mo.doOperation(something);
  //Do something with the returnedId;
}

我想測試這個方法,但我不能模擬構造函數調用,所以圍繞它的測試會打破模塊化。 我可以使用工廠方法或其他東西,但因為我只有一個構造函數沒有意義。

這通常是如何使用EasyMock完成的?

我不確定你是否可以逃離這里的工廠或將對象作為參數傳遞。 它可能感覺像是一個額外的痛苦世界,但如果你期望模擬對象,你經常需要以特定的樣式編碼。

我會傾向於工廠方向(當然,定義為界面)。 模擬工廠並在調用getMyObject()時讓它返回模擬對象:

public void myMethod(int p1, int p2, MyObject mo) {
  MyObject mo = factory.getMyObject(...args...);
  int returnedId = mo.doOperation(something);
}

public interface SomeFactory {    
  MyObject getMyObject(...args...);    
}

或者你可以創建一個接受MyObject作為參數的方法的重載版本,但它有點難看:

// Test this one, mocking 'mo'
public void myMethod(int p1, int p2, MyObject mo) {
  MyObject mo = new MyObject(var1,var2);
  int returnedId = mo.doOperation(something);
}

public void myMethod(int p1, int p2) {
  myMethod(p1, p2, new MyObject(...));
}

你不能只使用EasyMock。 但是有一些解決方法,比如使用PowerMock作為EasyMock的擴展,這樣你就可以模擬靜態方法,構造函數調用,最終方法等。

但在此之前,請仔細分析您的問題。 你真的需要在MyMethod創建MyObject嗎? 通常,以一種所有依賴關系作為構造函數參數或通過setter傳遞的方式來設計類要好得多。 這種模式通常稱為“依賴注入”。 通過執行依賴注入,可以避免像您提到的那樣的可測試性問題。

另外,正如Duncan Jones指出的那樣, MyMethod可以將MyObject作為參數,也可以由工廠獲得。 兩種解決方案通常比將對象實例化與應用程序邏輯混合更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM