2011-09-07 25 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

相關問題