SpockでオーバーロードされたメソッドをMockする #spock #groovy

JavaオーバーロードされたメソッドをMockしようとしても、うまくMockできないことがある。
どちらのメソッドを呼べばいいかわからないからだと思う。(たぶん)

下記のようなメソッドをMockしたい場合の対応。

public String doSomething(String arg1)
public String doSomething(String arg1, String arg2)

仮引数を明記する

オーバーロードされたメソッドをMockするには、Closureの仮引数を明記することで、対応可能。

// これだとうまくMockされない
doSomething(*_) >> {'もっくできないー'}

// 仮引数を明記するとうまくいく
doSomething(*_) >> {param1 -> '引数1個の方'}
doSomething(*_) >> {param1, param2 -> '引数2個の方'}

MissingMethodException

なお同じテストメソッド内で、両方のメソッドを呼ぼうとすると MissingMethodException が発生することがある。
※Mockしているのが片方だけであっても発生する

groovy.lang.MissingMethodException: No signature of method

これはMockしている引数を明示すると解決できる。

doSomething(_ as String) >> {param1 -> '引数1個の方'}
doSomething(_ as String, _ as String) >> {param1, param2 -> '引数2個の方'}

参考

hideoku.hatenablog.jp