0

私はjmockを初めて使用し、HttpSessionをモックしようとしています。私は得ています:

java.lang.AssertionError:予期しない呼び出し:httpServletRequest.getSession()期待値が指定されていません:あなたは...-カーディナリティ句で期待値を開始するのを忘れましたか?-モックされたメソッドを呼び出して、期待値のパラメーターを指定しますか?

試験方法:

@テスト

public void testDoAuthorization(){

    final HttpServletRequest request = context.mock(HttpServletRequest.class);
    final HttpSession session = request.getSession();

    context.checking(new Expectations(){{
       one(request).getSession(true); will(returnValue(session));
   }});

    assertTrue(dwnLoadCel.doAuthorization(session));
}

私は少し検索を行いましたが、これがどのように行われるのかはまだわかりません。小さなピースが欠けているような気がします。これの経験がある人なら誰でも私を正しい方向に向けることができます。ありがとう

4

2 に答える 2

2

リクエスト オブジェクトをモックする必要はありません。テストするメソッド ( dwnLoadCel.doAuthorization()) はオブジェクトにのみ依存するためHttpSession、それをモックする必要があります。したがって、コードは次のようになります。

public void testDoAuthorization(){
    final HttpSession session = context.mock(HttpSession.class);

    context.checking(new Expectations(){{
        // ???
    }});

    assertTrue(dwnLoadCel.doAuthorization(session));

}

問題は、SUTがセッション オブジェクトに対して実際に何をすることを期待しているのかということです。への呼び出しと、結果として が返さsessionれるはずの対応する戻り値を期待値で表現する必要があります。doAuthorizationtrue

于 2008-10-23T19:34:08.967 に答える
1

実際に先に進んで呼び出す前に、メソッドが呼び出されると予想される回数をJMockコンテキストに伝える必要があると思います。

final HttpServletRequest request = context.mock(HttpServletRequest.class);

context.checking(new Expectations(){{
  one(request).getSession(true); will(returnValue(session));
}});

final HttpSession session = request.getSession();

私はJMockにあまり詳しくありませんがdwnLoadCel、モックされたオブジェクトの特定のメソッドが何回呼び出されるかを単体テストで実際に気にしますか?または、実際のセッションなしでHttpSessionに依存するクラスをテストしようとしていますか?後者の場合、JMockはあなたにとってやり過ぎだと思います。

HttpSession単体テストのみ(スタブ)の目的でインターフェイスを自分で実装するクラスを作成し、それからテストを実行することを検討するか、それを調べて、本当に必要dwnLoadCelかどうかを判断する必要があります。 HttpSessionへの参照、またはHttpSession内にいくつかのプロパティが必要な場合。実際に必要なもの(またはSessionオブジェクト内の特定のパラメーター値)のみに依存するようにリファクタリングします。これにより、単体テストが容易になります(サーブレットコンテナーへの依存はさようならです)。dwnLoadCelMap

すでにテストされているクラスにある程度の依存性注入があると思いますが、オブジェクトの幅が広すぎることに依存している可能性があります。Google Test Blogには、最近、役立つと思われるDIに関する優れた記事がたくさん あります(確かにそうです)。

于 2008-10-23T16:40:32.293 に答える