[英]Mockito Mocking any I18n instance created runtime
我有一個場景,就像我在代碼中動態創建i18n對象實例一樣。 我正在使用以下代碼:
public String getLocaleString(Locale locale, SlingHttpServletRequest request){
final ResourceBundle bundle = request.getResourceBundle(locale);
I18n i18n = new I18n(bundle);
return i18n.get("local");
}
在這里,請嘲笑我。 但是i18n是動態創建的。 因此無法模擬i18n.get("local")
。
我嘗試使用:
when(any(I18n.class).get("local")).thenReturn("localizedString")
但是我不能。 我在這一行中收到NullPointerException。
我想使用Mockito模擬這種情況。 你們能幫我嗎? 謝謝。
Mockito建議重構以解決此https://code.google.com/p/mockito/wiki/MockingObjectCreation?ts=1332544670&updated=MockingObjectCreation
我通常避免測試該方法的內部。
但是在某些情況下,我確實需要使用PowerMockito https://code.google.com/p/powermock/wiki/MockConstructor
我認為不可能以這種方式使用any()
,因為它是一個參數匹配器,您只應使用方法調用來指定mock
對象,例如:
when(mock(i18n).get("local")).thenReturn("localizedString");
我認為這可能是您的NullPointerException
的來源。
但是要解決您的問題,我認為您有兩種選擇:
首先是使用工廠創建I18n
對象,然后模擬工廠:
...
private I18nFactory factory;
...
public String getLocaleString(Locale locale, SlingHttpServletRequest request){
final ResourceBundle bundle = request.getResourceBundle(locale);
I18n i18n = factory.get(bundle);
return i18n.get("local");
}
然后在測試中,設置工廠以生產所需的對象:
// Mock I18n, locale, request etc...
final I18nFactory factory = mock(I18nFactory.class);
when(factory.get(bundle)).thenReturn(i81n);
// Assign 'factory' to your Controller(?)
controller.setI18nFactory(factory);
// act, assert etc...
第二種方法是以new I18n(...)
創建滿足您期望的有效對象的方式來設置locale
並request
模擬/對象。
總而言之,我認為我更喜歡使用第二種方法,尤其是如果I18n
是第三方類的話。 盡管沒有關於測試目標的更多信息,但此答案有些猜測。 無論如何,我希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.