2011-09-07 26 views
2

编辑:清除了可读性的问题。请忽略截至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?

+3

我不知道Jmock的一部分,但例外是试图告诉你在当前运行时类路径中缺少'javax.el.E​​LContext'类。一个明显的解决方法是将其包含在运行时类路径中。配置项目的构建路径以包含目标运行时的库(servletcontainer/appserver)。 – BalusC

+0

根据您的编辑,EL API是JSF API的**依赖**。它被用来解决这些'#{}'事情。 EL API通常已经由目标运行时提供(Tomcat,JBoss,Glassfish等)。 – BalusC

+0

啊,很好。包括EL依赖帮助。模拟的上下文仍然很不稳定,但它一次只能一步一步..也许有人仍然有更多关于如何在facesContext中使用jmock的想法,或者如何使用FacesContext.getcurrentinstance()类来测试使用上述ViewScope实现的类。 (看起来我不会绕过FacesContext Wrapper/Provider ..?但是什么是模拟FacesContext的最佳方法?) – Pete

回答

4

我会去与PowerMock +的Mockito:

从你的链接:

private Map<String,Object> getViewMap() { 
    return FacesContext.getCurrentInstance().getViewRoot().getViewMap(); 
} 

在测试:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ FacesContext.class }); 
public class TheTest { 
    /* 
    * fake viewMap. 
    */ 
    private Map<String,Object> viewMap = Maps.newHashMap() // guava 

    /** 
    * mock for FaceContext 
    */ 
    @Mock 
    private FacesContext faceContext; 

    /** 
    * mock for UIViewRoot 
    */ 
    @Mock 
    private UIViewRoot uiViewRoot; 

    @Before 
    public void setUp() { 
     Mockito.doReturn(this.uiViewRoot).when(this.faceContext).getViewRoot(); 
     Mockito.doReturn(this.viewMap).when(this.uiViewRoot).getViewMap(); 

     PowerMock.mockStatic(FacesContext.class); 
     PowerMock.doReturn(this.faceContext).when(FacesContext.class, "getCurrentInstance"); 
    } 

    @Test 
    public void someTest() { 
     /* 
     * do your thing and when 
     * FacesContext.getCurrentInstance().getViewRoot().getViewMap(); 
     * is called, this.viewMap is returned. 
     */ 
    } 
} 

一些阅读:

+0

听起来很有希望。一旦我们回到我们的应用程序的前端,我会尝试。这可能需要一段时间,所以请耐心等待赏金;) – Pete

+0

点是帮助不获得赏金; o – 2011-11-30 07:26:51

相关问题