私は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 を使用している理由を聞かないでください - 私には理由があります。;)
ありがとうございました