2014-03-19 110 views
1

我有以下領域在我班上懲戒類

@Resource(name = "lobIdCancellationNodeMap") 
private Map<String, List<String>> lobIdCancellationNodeMap; 

這條線,我們直接訪問這個領域lobIdCancellationNodeMap後的私人領域

我不能爲這個使用設定值Mockito,並且沒有可以設置這個值的construtor。

這是它是如何使用

lobIdCancellationNodeMap.get(lobId) 

我不允許改變實現類

+1

如何使用公共存取方法並嘲笑它?如果這不能削減它,你可能會測試錯誤的東西。 – CompuChip

+5

如果該字段是私人的,那麼測試不應該嘗試訪問它。測試應該驗證對象的面向公衆的行爲。 – David

+0

如果你的代碼是私人的,你是如何直接訪問它的? – LaurentG

回答

1

我已經通過使用ReflectionTestUtils解決了這個問題。使用這個類可以設置類的任何字段,而不管它的訪問修飾符如何。

ReflectionTestUtils.setField(mapper, "lobIdCancellationNodeMap", lobIdCancellationNodeMap); 
2

雖然我與其他用戶的筆記,這似乎是錯誤的被測試的東西,是不同意面向公衆,我確實對「我不能改變實施階級」的情況表示同情。

@Resource註釋旨在用於讓應用程序在運行時注入實例。我建議你在運行時使用類似於應用程序的上下文來設置你的測試。這樣,這個類將注入其資源。

如果失敗,您可以使用Reflection將值設置爲您需要的值。

+0

如果你可以讓字段保護,那麼你的單元測試可以在沒有外部類訪問的情況下進行設置。我知道你不能改變實現,但爲了測試的目的訪問字段與改變API不一樣。 –