JMockit创建了一个假的FacesContext ResourceBundle



以前我一直在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();
}

相关内容

  • 没有找到相关文章

最新更新