我试图用Spock编写测试,但是我有一些问题。代码将告诉更多...我的测试如下:
class MyServiceSpec extends Specification {
private MyService myService
private MyDAO myDAO
def setup() {
myDAO = Mock(MyDAO)
myService = new MyServiceImpl(myDAO)
}
def "Should get something"() {
given:
def user = Mock(User)
def date = now()
myDAO.getUsersSomethingFromDate(_ as User, _ as LocalDate) >> [ Mock(Something) ]
when:
myService.getUsersSomethingFromDate(user, date)
then:
1 * myDAO.getUsersSomethingFromDate(_ as User, _ as LocalDate)
}
}
MyDAO
是interface
。我也尝试了不同的setup
方法:
def setup() {
myDAO = Mock(MyDAO) {
getUsersSomethingFromDate(_ as User, _ as LocalDate) >> [ Mock(Something) ]
}
myService = new MyServiceImpl(myDAO)
}
尽管我声明方法getUsersSomethingFromDate
应该返回[ Mock(Something) ]
,但它返回null
。在下一个服务方法运行中,我收到NullPointerException
,因为返回的是“空”而不是模拟实例的列表。问题是为什么具有声明值要返回的模拟对象仍然返回null
?
将模拟与调用计数检查结合起来会出现问题,因为那时不会调用模拟。
您可以通过这种方式重写组合测试以使其正常工作:
def "Should get something"() {
given:
def user = Mock(User)
def date = now()
when:
myService.getUsersSomethingFromDate(user, date)
then:
1 * myDAO.getUsersSomethingFromDate(_ as User, _ as LocalDate) >> [ Mock(Something) ]
}
请参见http://spockframework.org/spock/docs/1.3/all_in_one.html#_combining_mocking_and_stubbing