0

JSF アプリの wirint テストケースに問題があります。だから私はログアウト方法をテストしたい:

            FacesContext context = EasyMock.createMock(FacesContext.class);
            String userName = "testUserName";
            HttpSession session = EasyMock.createMock(HttpSession.class);
            ExternalContext ext = EasyMock.createMock(ExternalContext.class);
            EasyMock.expect(ext.getSession(true)).andReturn(session);
            EasyMock.expect(context.getExternalContext()).andReturn(ext).times(2);
            context.getExternalContext().invalidateSession();
            EasyMock.expectLastCall().once();           

            EasyMock.replay(context);
            EasyMock.replay(ext);
            EasyMock.replay(session);

            loginForm = new LoginForm();
            loginForm.setUserName(userName);
            String expected = "login";
            String actual = loginForm.logout();
            context.release();

            Assert.assertEquals(expected, actual);
            EasyMock.verify(context);
            EasyMock.verify(ext);
            EasyMock.verify(session);

私のログアウト方法は次のとおりです。

    public String logout() {
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        return "/authentication/login.xhtml?faces-redirect=true";
    }

私の問題は、ここで nullpointer 例外が発生したことです: EasyMock.expectLastCall().once() どのように適切にテストする必要がありますか? モックに問題があると思いますが、解決策を見つけることができませんでした。この場合、FacesContext を適切にモックするにはどうすればよいですか

4

2 に答える 2

2

上記の作業を行うために、たとえばPowerMockを使用できます。これは、 EasyMockのようなモック ライブラリを追加機能で拡張できるフレームワークです。この場合、 の静的メソッドをモックできますFacesContext

Maven を使用している場合は、次のリンクを使用して、必要な依存関係の設定を確認してください。

これら 2 つの注釈を使用して、JUnit テスト クラスに注釈を付けます。最初のアノテーションは、JUnit に を使用してテストを実行するように指示しますPowerMockRunner。2 番目の注釈は、クラスをモックする準備をするようにPowerMockに指示します。FacesContext

@RunWith(PowerMockRunner.class)
@PrepareForTest({ FacesContext.class })
public class LoginFormTest {

次に、他のクラスと同じように、PowerMockFacesContextを使用してモックを作成します。唯一の違いは、今回はインスタンスではなくクラスで実行することです。replay()verify()

@Test
public void testLogout() {

    // mock all static methods of FacesContext
    PowerMock.mockStatic(FacesContext.class);

    FacesContext context = EasyMock.createMock(FacesContext.class);
    ExternalContext ext = EasyMock.createMock(ExternalContext.class);

    EasyMock.expect(FacesContext.getCurrentInstance()).andReturn(context);
    EasyMock.expect(context.getExternalContext()).andReturn(ext);

    ext.invalidateSession();
    // expect the call to the invalidateSession() method
    EasyMock.expectLastCall();
    context.release();

    // replay the class (not the instance)
    PowerMock.replay(FacesContext.class);
    EasyMock.replay(context);
    EasyMock.replay(ext);

    String userName = "testUserName";
    LoginForm loginForm = new LoginForm();
    loginForm.setUserName(userName);

    String expected = "/authentication/login.xhtml?faces-redirect=true";
    String actual = loginForm.logout();
    context.release();

    Assert.assertEquals(expected, actual);

    // verify the class (not the instance)
    PowerMock.verify(FacesContext.class);
    EasyMock.verify(context);
    EasyMock.verify(ext);
}

上記のコード サンプルをより詳細に説明するブログ投稿を作成しました。

于 2014-11-09T14:16:27.940 に答える
0

これ:

FacesContext context = EasyMock.createMock(FacesContext.class);

これからの戻り値を変更しません(テストされているクラスで):

FacesContext.getCurrentInstance()

モックされた FacesContext でFacesContext保護されたメソッドを拡張してから呼び出す必要があります。setCurrentInstance

于 2014-03-26T15:16:33.873 に答える