簡體   English   中英

Mockito模擬任何I18n實例創建的運行時

[英]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(...)創建滿足您期望的有效對象的方式來設置localerequest模擬/對象。

總而言之,我認為我更喜歡使用第二種方法,尤其是如果I18n是第三方類的話。 盡管沒有關於測試目標的更多信息,但此答案有些猜測。 無論如何,我希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM