编辑:清除了可读性的问题。请忽略截至10月31日的评论。如何在实际Web应用程序之外用单元测试的ViewMap模拟JSF FacesContext?
在我们的应用程序堆栈中,我们使用许多较小的jar模块,将它们组合到最终的Web应用程序中。一个模块定义JSF功能,如实施this ViewScope。
现在从集成测试开始,我们希望能够对每个部分进行单元测试,因此需要一种方法来模拟完整的Faces上下文(通过包装器来访问)来测试使用它的类。
这里最重要的部分是完整这意味着它必须有一个初始化ViewMap
,因为这是我们的ViewScope
把它的对象。
我已经尝试不同的方法:
1)页岩测试:我来最远的这个惜项目退役。
到目前为止,我已将FacesContext包装在提供程序中,该提供程序允许使用Mocked FacesContext替换它以进行测试。我还修改了AbstractViewControllerTestCase的shale实现,以包含应用程序上下文。
但是,当致电MockedFacesContext.getViewRoot().getViewMap()
,因为这将抛出UnsupportedOperationException
。原因似乎是MockApplication没有实例化这个方法调用所需的Application.defaultApplication(它是null)。这似乎是一个页岩试验限制。
2)JMock或的Mockito这些在我看来,不是没有真正模拟任何东西,因为大多数成员将只停留空。不知道JMock或mockito是否可以实际调用propper初始化方法。
3)自定义面孔莫克:对我来说这似乎是唯一的选择,但我们真的没有分析是如何面对被初始化并重新创建嘲弄目的的行为的时间。也许有人以前没有这个,可以分享主要的航点和陷阱?
或者是否有任何替代方法来模拟Web应用程序之外的FacesContext?
我不知道Jmock的一部分,但例外是试图告诉你在当前运行时类路径中缺少'javax.el.ELContext'类。一个明显的解决方法是将其包含在运行时类路径中。配置项目的构建路径以包含目标运行时的库(servletcontainer/appserver)。 – BalusC
根据您的编辑,EL API是JSF API的**依赖**。它被用来解决这些'#{}'事情。 EL API通常已经由目标运行时提供(Tomcat,JBoss,Glassfish等)。 – BalusC
啊,很好。包括EL依赖帮助。模拟的上下文仍然很不稳定,但它一次只能一步一步..也许有人仍然有更多关于如何在facesContext中使用jmock的想法,或者如何使用FacesContext.getcurrentinstance()类来测试使用上述ViewScope实现的类。 (看起来我不会绕过FacesContext Wrapper/Provider ..?但是什么是模拟FacesContext的最佳方法?) – Pete