以前我一直在ResourceBundle
上使用@Mocked
,例如
@Test
public void testMyMethod(@Mocked final ResourceBundle resourceBundle) {
new Expectations() {
{
resourceBundle.getString("someString");
result = "myResult";
}
}
}
这工作得很好,直到我正在测试的特定方法有以下代码行
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
如果我使用上面的方法创建了一个模拟ResourceBundle
,那么我的测试将在这一行抛出一个NumberFormatException
,原因是SimpleDateFormat
构造函数在为其默认的Locale
构建Calendar
实例的同时对ResourceBundle
进行了一些工作。
所以我想做的是创建一个假的,将返回我的模拟结果的一些调用getString
和默认的其他人,例如
new Mockup<ResourceBundle>() {
@Mock
public String getString(Invocation inv, String key) {
if ("someString".equals(key)) {
return "myResult";
} else if ("someOtherString".equals(key)) {
return "myOtherResult";
} else {
return inv.proceed();
}
}
};
当它通过FacesContext
eg检索时,我希望使用这个假ResourceBundle
。
FacesContext facesContext = FacesContext.getCurrentInstance();
ResourceBundle bundle = facesContext.getApplication().getResourceBundle(facesContext, "myBundle");
由于我的测试没有在运行容器内运行,我正在模拟FacesContext
,我想使用我创建的假,所以我有这样的东西
@Test
public void testMyMethod(@Mocked final FacesContext facesContext) {
final ResourceBundle resourceBundle = new Mockup<ResourceBundle>() {
@Mock
public String getString(Invocation inv, String key) {
if ("someString".equals(key)) {
return "myResult";
} else if ("someOtherString".equals(key)) {
return "myOtherResult";
} else {
return inv.proceed();
}
}
}.getMockInstance();
new Expectations() {
{
facesContext.getApplication().getResourceBundle(facesContext, "myBundle");
result = resourceBundle;
}
unitUnderTest.methodUnderTest();
}
然而,它看起来是使用默认的ResourceBundle getString()
在所有情况下,而不是使用我的假
好的,所以我设法找到了一个解决方案,做什么我想要的,关键是得到这个工作是使用Deencapsulation.invoke
上的FacesContext.setCurrentInstance()
@Test
public void testMyMethod() {
final FacesContext facesContext = new Mockup<FacesContext>() {
@Mock
public Application getApplication() {
return new MockUp<Application>() {
@Mock
public ResourceBundle getResourceBundle(FacesContext ctx, String name) {
return new MockUp<ResourceBundle>() {
@Mock
public String getString(Invocation inv, String key) {
if ("someString".equals(key)) {
return "myResult";
} else if ("someOtherString".equals(key)) {
return "myOtherResult";
} else {
return inv.proceed();
}
}
}.getMockInstance();
}
}.getMockInstance();
}
}.getMockInstance();
Deencapsulation.invoke(FacesContext.class, "setCurrentInstance", facesContext);
unitUnderTest.methodUnderTest();
}