2011-10-01 67 views
1

我正在寫一個CustomerHelper的junit,它在內部調用AccountHelper對象的方法。 CustomerHelper使用其中一個方法創建帶有新操作符的AccountHelper對象。現在,如果我想嘲笑AccountHelper對象。 有什麼辦法可以做到嗎?Java如何模擬java中的對象和靜態方法?

如果這個依賴項(AccountHelper在這種情況下)會被某個setter或構造函數注入,我可以設置我的MockAccountHelper。 對不對? 但是當我們使用New運算符創建依賴關係時,有什麼辦法可以嘲笑嗎?

第二個問題 - 反正我們可以使用核心Java庫嘲笑靜態方法沒有去爲電源/易模擬即使我去嘲笑權力,想了解它是如何在短暫的內部做?

回答

1

JMockit允許您輕鬆地模擬靜態方法和內部構建的對象。

你會做這樣的事情:

@Test 
public void testWhatever() { 
    new Expectations() { 
     AccountHelper accountHelper; 
     { 
      new AccountHelper(); 
      accountHelper.someMethod(); 
    }} 
    objectUnderTest.doWhatever(); 
} 

我不相信有嘲笑的核心Java庫靜態方法,內置方式。我也不確定內部發生了什麼,但我認爲JMockit會進行某種類型的字節碼級別的修改,以便隨時替換類。

+0

謝謝卡梅隆。我認爲它必須通過客戶階層來完成。請爲此拍攝另一個問題。 –

0

您需要一種方法在您的測試用例中將AccountHelper的模擬設置到您的CustomerHelper。所以你的CustomerHelper類將需要一個AccountHelper的setter或一個可以傳遞所需AccountHelper的構造函數。 我想你沒有辦法設置一個模擬,如果AccountHelper在本地方法實例化。你無法從外部訪問它(比如你的junit測試用例),它的作用範圍僅僅侷限於你的方法。

你不能嘲笑靜態方法。我想,嘲諷庫動態使用一些字節碼生成庫,如 http://asm.ow2.org/index.htmlhttp://cglib.sourceforge.net/ 字節碼框架將在運行時生成模擬類的字節碼創建嘲弄。他們通過重寫方法來做到這一點。但是靜態方法不能被覆蓋。

Tiberiu

0

如果這種依賴(AccountHelper在這種情況下),會被一些調節器或構造注​​入,我可能已經把我的MockAccountHelper.Right?但是當我們使用New運算符創建依賴關係時,有什麼辦法可以嘲笑嗎?

是的 - 這是正確的,但更重要的是,注入對象的目​​的是讓對象的類型實現一個接口,然後也可以使用嘲笑類型。嘲笑沒有任何明確界面的類型的問題在於,創建並行模擬類型並不容易,這些類型在保證履行原有合同的同時保證遵守原始合同。

我看到你的情況可能的唯一方法是創建一個新的類型AccountHelperMock,擴展AccountHelper並覆蓋所有方法(我希望它可以)。然後在你的代碼中手動將new AccountHelper()替換爲new AccountHelperMock()

0

powermockito庫可用於模擬測試類中的靜態方法調用。對於powermockito庫Maven倉庫是:

<dependency> 
<groupId>org.powermock</groupId> 
<artifactId>powermock-api-mockito</artifactId> 
<version>1.6.6</version> 
</dependency> 

如果你想需要更多powermockito,這裏是a link

0

我在測試靜態方法時使用下面的代碼結構。

Powermock.mockStatic(Something.class) 

Something.someMethod(); // Static Method you want to mock 
EasyMock.expectLastCall().andReturn(/*Whatever you want to return*/); 

Powermock.replay(Something.class); 

// Call which makes use of Something.someMethod 

Powermock.verify(Something.class); 

理想情況下,您不應該需要測試靜態方法。 PowerMock是一個Java框架,它允許你單元測試通常被認爲是不可測試的代碼。