2013-06-12 59 views
1

我在爲包含以下代碼的方法創建junit測試用例時面臨問題。我不得不使用模擬對象繞過這條線。如何使用mockito進行方法鏈

SecurityContextHolder.getContext()。getAuthentication()。getPrinciple();

請幫助我爲這種方法鏈創建模擬對象,任何建議/想法是最受歡迎的。

在此先感謝..

回答

0

另一種方式是委託代碼即:

SecurityContextHolder.getContext().getAuthentication().getPrinciple() 

到另一個對象,例如:

AuthenticationService 

然後自動線在你的代碼的服務。你可以在你的測試中嘲笑服務。

希望有所幫助。

3

你可能是出於運氣,如果你需要使用的Mockito - it can't mock static methods,這是你需要呼籲static method getContext() on SecurityContextHolder做的第一件事。

另一種可能能夠模擬第一個呼叫的方法是powermock。如果可以通過第一個靜態方法,嘲笑鏈的其餘部分可能會涉及到嘲笑每個調用的返回值並手動設置鏈,例如,創建一個模擬的Authentication實例,以便由您的模擬SecurityContext實例返回, 等等。

0

正如@Brabster所說,你不能嘲笑靜態方法。如果你仍然想使用mockito,你需要找到一種方法來模擬getContext()返回的結果。這可以通過修改被測系統來給它一個測試模式來完成。當它處於該測試模式時,您可以調用setter將返回值設置爲mockito模擬。或者,您可以通過將setTestContext(...)方法添加到課程中來結合這些步驟。

看看這是怎麼寫的?這是因爲你試圖測試的代碼很糟糕,並不是因爲mockito缺少一個功能。 Mockito指出了一種代碼味道。

+0

任何人都可以在不更改應用程序代碼的情況下建議我使用替代方法 – ManojP

+0

實際上,這看起來像是一種很好的'static'方法。特別是在Web應用程序中,能夠輕鬆地從任何可能需要登錄的用戶處獲得登錄用戶是非常有用的。 (我過去已經這樣做了。)使用ThreadLocal很容易實現,並且比替代方法更容易使用(DI,或者通過方法參數從調用堆棧頂部傳遞)。至於它很容易嘲笑,這完全取決於正在使用的模擬API。 –