JmockはHttpSessionおよびHttpServletRequestでどのように使用されますか
質問
jmockは初めてで、HttpSessionをモックしようとしています。取得しています:
java.lang.AssertionError:予期しない呼び出し:httpServletRequest.getSession() 期待は指定されていません:あなたは... -基数句で期待値を開始するのを忘れましたか? -模擬メソッドを呼び出して、期待値のパラメーターを指定しますか?
テスト方法:
@Test
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));
}
少し検索を行いましたが、これがどのように行われるかはまだ明確ではありません。私はいくつかの小さな作品を見逃しているように感じます。これに経験のある人なら誰でも正しい方向に私を向けることができます。 ありがとう
解決
リクエストオブジェクトをモックする必要はありません。テストするメソッド( dwnLoadCel.doAuthorization()
)は HttpSession
オブジェクトにのみ依存するため、モックする必要があります。したがって、コードは次のようになります。
public void testDoAuthorization(){
final HttpSession session = context.mock(HttpSession.class);
context.checking(new Expectations(){{
// ???
}});
assertTrue(dwnLoadCel.doAuthorization(session));
}
質問は次のようになります。SUTがセッションオブジェクトを実際に行うとはどういうことでしょうか。 session
の呼び出しと、それに対応する doAuthorization
が true
を返すことになっている戻り値を期待して表現する必要があります。
他のヒント
実際に実行して呼び出す前に、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内のいくつかのプロパティのみを必要とするのかを判断します。 dwnLoadCel
をリファクタリングして、実際に必要なもの( Map
またはSessionオブジェクト内の特定のパラメーター値)のみに依存します。これにより、ユニットテストが容易になります(サーブレットコンテナはさようなら)。
既にテスト中のクラスにはある程度の依存性注入があると思いますが、オブジェクトの範囲が広すぎることに依存している可能性があります。 Googleテストブログには、たくさん 優れた 最近あなたが役に立つと思う記事()