我有一个 Java 类:
import java.util.List;
public class Service
{
public List<Object> someMethod(final List<Object> list) {
return null;
}
}
还有一个 Spock 测试,我在其中定义了一个自定义匹配器:
导入 org.mockito.ArgumentMatcher 导入 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
,我不会出错。所以它不喜欢的是测试的存根部分,以及我两次使用自定义匹配器的事实。
笔记:
- 我尝试为每个列表大小声明一个单独的类,如给定大小的 mockito anyList和 Mockito 文档。我犯了同样的错误。
- 我尝试使用看起来像这样的 Hamcrest 匹配器,但尽管 1.3 Javadocs 列出了 Matchers.hasSize() 方法,但我导入的 1.3 jar 不包括 Matchers。(但即使我解决了依赖关系,我仍然想了解这个问题。)
请不要问我为什么使用 Mockito 而不是 Spock Mocks - 我有我的理由。;)
谢谢