私はSpockを使用しており、テストするクラスはSpyにラップされています。テスト対象のメソッドを分離したいので、テスト対象のメソッドから呼び出される他のメソッドをスタブ化しようとしています。通常、私は次のようなものを使用します。
1 * classToTest.methodName(_) >> stubbed_return_value
私の問題はこれです:methodName
はvoidメソッドです。私はこれを試しました:
1 * classToTest.methodName(_)
ただし、実際のメソッドは引き続き呼び出されます。
Spockを使用してvoidメソッドをスタブ化するにはどうすればよいですか?
null
..でスタブすることができます.
次の場合Javaクラス:
public class Complex {
private final List<String> sideEffects = new ArrayList<>();
protected void sideEffect(String name) {
sideEffects.add("Side effect for " + name);
}
public int call(String name) {
sideEffect(name);
return name.length();
}
public List<String> getSideEffects() {
return sideEffects;
}
}
sideEffect
メソッドを非表示にしたいので、何も実行されないため、次の仕様を使用できます。
class ComplexSpec extends Specification {
def 'we can ignore void methods in Spies'() {
given:
Complex complex = Spy()
when:
int result = complex.call('tim')
then:
result == 3
1 * complex.sideEffect(_) >> null
complex.sideEffects == []
}
}
(nullの代わりに)空のクロージャーを返すこともできます。
1 * complex.sideEffect(_) >> {}