web-dev-qa-db-ja.com

Spockでモック引数キャプチャを行う方法はありますか

私は周りを見回して、無駄にさまざまなことを試みました。インターウェブ上にある例は少なく、私見は非常に単純です。私のユースケース:

(以下の「itocNetworkHandler」はモックです)

when: "we're doing stuff"
    StandardResponse response = cms.doCardStuff("123", "111", order)
....
then: "we get proper calls and response object"
    1 * cms.itocNetworkHandler.doNetworkCall(
            { it instanceof ReplacementRequestRecord
            }, StandardResponseRecord.class) >> record

パラメータ(「it」)をモックの「doNetworkCall」に保存したいと思います。

パラメータが必要な理由は、テストしているオブジェクトがパラメータを取り込んで処理を行い、新しいオブジェクトを作成して、そのオブジェクトをモックに渡すことになっているためです。作成したオブジェクトが想定どおりに見えることを確認したいと思います。

ポインタは大歓迎です。

31
Mathias

次のように引数をキャプチャできます。

_// must be declared before when-block (or inside Specification.interaction {})
def captured

when:
...

then:
1 * mock.doNetworkCall(...) >> { record, recordClass -> 
    // save the argument
    captured = record
    ...
}
// use the saved argument
captured == ...
_

とは言うものの、引数制約で期待されるレコードをチェックするなど、より簡単な解決策があることがよくあります(例:...doNetworkCall( { it == ... } ))。

43