0

我有一个场景,就像我在代码中动态创建 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 来模拟这个场景。你们能帮帮我吗?谢谢。

4

2 回答 2

2

Mockito 建议重构以解决此问题https://code.google.com/p/mockito/wiki/MockingObjectCreation?ts=1332544670&updated=MockingObjectCreation

我通常避免测试该方法的内部结构。

但在某些情况下,当我真的需要时,我会使用 PowerMockito https://code.google.com/p/powermock/wiki/MockConstructor

于 2013-04-11T09:04:19.333 回答
1

我认为不可能以any()这种方式使用,因为它是一个参数匹配器,你应该只指定一个mock带有方法调用的对象,例如:

when(mock(i18n).get("local")).thenReturn("localizedString");

我认为这可能是您的NullPointerException.

但是要解决您的问题,我认为您有两种选择:

首先是使用工厂创建I18n对象,然后mock工厂:

...
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...

第二种方法是以创建满足您期望的有效对象的方式设置localerequest模拟/对象。new I18n(...)

总的来说,我认为我更喜欢使用第二种方法,特别是如果I18n是第 3 方课程。尽管没有关于您的测试目的的更多信息,但这个答案有点投机。无论如何,我希望这会有所帮助。

于 2013-04-11T09:21:06.753 回答