4

編集:読みやすくするために質問を整理しました。10月31日までのコメントは無視してください。

私たちのアプリケーション スタックでは、最終的な Web アプリケーションに結合される多くの小さな jar モジュールを操作します。1 つのモジュールは、このViewScopeの実装など、JSF 機能を定義します。

統合テストとは別に、すべての部分を単体テストできるようにしたいので、完全な Faces Context (ラッパー経由でアクセス) をモックして、それを使用するクラスをテストする方法が必要です。

ここで重要な部分は、オブジェクトを配置する場所であるため、初期化する必要があるという完全な意味です。ViewMapViewScope


私はさまざまなアプローチを試しました:

1) shale-test : 私はこれで最も遠くまで来ましたが、残念ながらプロジェクトは廃止されました。

これまでのところ、FacesContext を Provider でラップして、テスト用に Mocked FacesContext に置き換えることができました。また、AbstractViewControllerTestCase のシェール実装を変更して、アプリケーション コンテキストを含めました。

MockedFacesContext.getViewRoot().getViewMap()ただし、 as this を呼び出すと、 UnsupportedOperationException. 理由は、MockApplication が、このメソッド呼び出しに必要な Application.defaultApplication (null) をインスタンス化していないためと思われます。これはシェールテストの制限のようです。


2)JMockまたはmockitoほとんどのメンバーはnullのままであるため、これらは実際には何もモックしていないように思えます。JMock または mockito が実際に適切な初期化メソッドを呼び出すことができるかどうかはわかりません。


3) カスタム Faces Mocker:私には、これが唯一残っているオプションのように思えますが、Faces がどのように初期化されているかを分析し、モックの目的で動作を再現する時間がありません。多分誰かがこれまでにこれをしたことがなく、主要なウェイポイントと落とし穴を共有できますか?


または、Web アプリケーションの外部で FacesContext をモックする別の方法はありますか?

4

1 に答える 1

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.
         */
    }
}

いくつかの読書:

于 2011-11-30T07:18:40.783 に答える