[英]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.