3

私はそのようなコードを持っています:

@TestFor(MyService)
class MyServiceTests {
    void testIt() {
        def logTo = []
        def loggerMock = mockFor(service.log.class)
        loggerMock.demand.error(1..1) { String msg, Exception ex ->
            logTo << [level: 'error', msg: msg, ex: ex]
        }
        service.log = loggerMock.createMock()
    }
}

次のエラーで失敗します。

| Failure:  testIt(MyServiceTests)
|  java.lang.ArrayIndexOutOfBoundsException: 0
    at SLF4JLog_groovyProxy.<init>(Script1.groovy:4)
    at Script1.run(Script1.groovy:8)
    at grails.test.GrailsMock.createMock(GrailsMock.groovy:91)
    at package.MyServiceTests.testIt>>>(MyServiceTests.groovy:25)

行を指していますservice.log = loggerMock.createMock()。どうしたの?

4

1 に答える 1

1

これは、引数が 0 のコンストラクターを持たないオブジェクトをモックしようとしたときに表示された、非常に情報に乏しいエラー メッセージです。別のクラスのメンバーから取得しているため、そこでモックしようとしているのはどのクラスかわかりませんが、Beanとして(引数なしで)構築できることを確認します。そうではなく、おそらくそれが問題です。

もう少し調べてみると、クラス SLF4JLog には引数が 0 のコンストラクターがないのではないかと推測しています。mockFor を使用してそれをモックするには、次の行に沿って何かを行う必要があります (SLF4JLog コンストラクターで受け入れ可能な引数を決定する必要があることに注意してください。

  void test_create_proxy_instance_with_constructor_arguments() {
    def mock = new MockFor(MockForTestClassWithConstructorArgs)
    mock.demand.amethod { "from mock with proxy"}

    def proxy = mock.proxyInstance(["value1", "value2"]as Object[])
    assertEquals "from mock with proxy", proxy.amethod()
    mock.verify proxy
  }

ソース: http://groovy.codehaus.org/Using+MockFor+and+StubFor

これは、必要以上に複雑になる可能性があります。ロガーを使用するクラスをテストしていると思いますか? そのクラスがそのロガーをクラス (静的型) で参照せず、代わりに「def」を使用することを願っています。その場合、クラスが Logger オブジェクトで呼び出すすべての「メソッド」をたまたま持っている古いスタブ (参照を再度参照) を渡すことができます。

于 2013-02-17T01:11:32.990 に答える