私はJavaクラスを持っています:
  import java.util.List;
  public class Service
  {
     public List<Object> someMethod(final List<Object> list) {
        return null;
     }
  }
そして、カスタム マッチャーを定義した Spock テスト:
import org.mockito.ArgumentMatcher import spock.lang.Specification
    import static org.mockito.Mockito.*
    class InstantBookingInitialDecisionTest extends Specification {
        def mock = mock(Service.class)
        def setup() {
            when(mock.someMethod(argThat(hasSize(2)))).thenReturn([])
            when(mock.someMethod(argThat(hasSize(3)))).thenReturn([])
        }
        def 'Minimum hunger requirements do not apply to schedulable pros'() {
            when:
            'something'
            then:
            'something else'
        }
        // Damn, there's a Hamcrest matcher for this, but it's not in the jar that the javadocs say it is, so making my own
        static def hasSize(size) {
            new ArgumentMatcher<List>() {
                @Override
                boolean matches(Object o) {
                    List list = (List) o
                    return list.size() == size
                }
            }
        }
    }
このテストでは、次のエラーが表示されます。
java.lang.NullPointerException: Cannot invoke method size() on null object
のいずれかを削除しても、whenエラーは発生しません。気に入らないのは、テストのスタブ部分と、カスタム マッチャーを 2 回使用したことです。
ノート:
- 特定のサイズのmockito anyListとMockitoのドキュメントのように、リストサイズごとに個別のクラスを宣言しようとしました。同じエラーが発生します。
- このような Hamcrest マッチャーを使用しようとしましたが、1.3 の Javadoc に Matchers.hasSize() メソッドがリストされているにもかかわらず、インポートした 1.3 jar にマッチャーが含まれていません。(ただし、依存関係が解決されたとしても、問題を理解したいと思います。)
Spock Mocks の代わりに Mockito を使用している理由を聞かないでください - 私には理由があります。;)
ありがとうございました