web-dev-qa-db-ja.com

Spockを使用してSpyオブジェクトのvoidメソッドをスタブします

私はSpockを使用しており、テストするクラスはSpyにラップされています。テスト対象のメソッドを分離したいので、テスト対象のメソッドから呼び出される他のメソッドをスタブ化しようとしています。通常、私は次のようなものを使用します。

1 * classToTest.methodName(_) >> stubbed_return_value

私の問題はこれです:methodNameはvoidメソッドです。私はこれを試しました:

1 * classToTest.methodName(_)

ただし、実際のメソッドは引き続き呼び出されます。

Spockを使用してvoidメソッドをスタブ化するにはどうすればよいですか?

6
DwB

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 == []
    }
}
7
tim_yates

(nullの代わりに)空のクロージャーを返すこともできます。

1 * complex.sideEffect(_) >> {}
3
vadim