我有一个服务类定义如下
class MyService {
def otherService;
def performService( ) {
Navigator.navigate( retrieveData, { otherService.doSomething(it) } );
}
def retrieveData = { Integer offset, Integer maxRows
DomainObject.list(offset,maxRows);
}
}
Navigator.navigate( Closure retriever, Closure processor ) {
def offset=0;
def batchsize=100;
while( (data=retriever(offset,batchsize)) ) {
if(data.size()==0) break;
data.each { processor(it) }
offset += data.size();
}
}
在我的测试中,我想模拟retriveData来检索模拟对象
@TestFor(MyService)
class MyServiceSpec extends Specification {
def "test retriever"() {
given:
service.otherService = Mock(OtherService);
service.metaClass.retrieveData = { Integer offset, Integer maxRows ->
if(offset==0) return [ Mock(DomainObject), Mock(DomainObject) ]
else return []
}
when:
service.performService();
then:
2 * otherService.doSomething(_);
}
}
事实证明,测试没有拿起模拟的retrieveData,而是总是拿起MyService.retrieveData闭包,想知道什么是模拟闭包方法的正确方法..
答案 0 :(得分:0)
似乎是因为retrieveData
是一个字段,而不是一个方法。你能尝试一下:
given:
...
service.retrieveData = { Integer offset, Integer maxRows ->
...
}