5

Spockで単体テストを行い、HttpServletRequestの呼び出しを確認するServletFilterがあります。

次のコードはスローします java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/http/Cookie

def "some meaningless test"(){
    given:
    HttpServletRequest  servletRequest = Mock(HttpServletRequest)

    when:
    1+1

    then:
    true
}

JavaEE 5 API(したがってサーブレットAPI)はクラスパス上にあります。Spockのバージョンは0.6-groovy-1.8です。

どうすればそれを正しく行うことができますか?Mockitoで動作しますが、Spockのモックの素晴らしさを失います。

編集:サーブレット用のGrailsとSpringに組み込まれているモック機能について知っていますが、Spockモックでそれを行う方法があるかどうかを知りたいだけです。そうでなければ、モックのセットアップテクニックが混在しているでしょう...

4

2 に答える 2

4

Grails は、テストで使用できるMockHttpServletRequestMockHttpServletResponse、およびを使用して各統合テストを自動的に構成します。MockHttpSession

単体テストでは、新しいMockHttpServletRequestをインポートしてインスタンス化する必要があります。

import org.springframework.mock.web.MockHttpServletRequest

def "some meaningless test"(){
    given:
    def servletRequest = new MockHttpServletRequest()

    when:
    1+1

    then:
    true
}
于 2012-05-25T10:36:40.540 に答える
2

Spock は、インターフェイスのモックに JDK 動的プロキシを使用し、クラスのモックに CGLIB を使用します。Mockito は両方に CGLIB を使用します。これは、モック化されたインターフェース ( などjavax.servlet.http.HttpServletRequest) がクラス ( など) を参照するいくつかの状況で違いを生むようjavax.servlet.http.Cookieです。どうやら、Spock の場合、Cookieクラスがロードされ、サーブレット API Jar 内のクラスには (空のメソッド本体ではなく) メソッド本体がないため、クラスの読み込みエラーが発生します。

現在、Spock はインターフェイスに CGLIB の使用を強制する方法を提供していません。これは、API Jar ではなく、サーブレット実装 Jar をテスト クラス パスに配置するか (いずれにせよ、おそらくより安全な方法です)、Mockito を使用できることを意味します。

于 2012-05-26T06:15:55.087 に答える