Grails 如何模拟闭包方法
我有一个服务类,定义如下Grails 如何模拟闭包方法,grails,mocking,Grails,Mocking,我有一个服务类,定义如下 class MyService { def otherService; def performService( ) { Navigator.navigate( retrieveData, { otherService.doSomething(it) } ); } def retrieveData = { Integer offset, Integer maxRows DomainObject.list(offset,maxRows
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();
}
}
在我的测试中,我想模拟RetrieveData来检索模拟对象
@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闭包,想知道什么是模拟闭包方法的正确方法。似乎是因为
retrieveData
是一个字段,而不是一个方法。你能试试吗
given:
...
service.retrieveData = { Integer offset, Integer maxRows ->
...
}
是的,就是这样,闭包的行为看起来像字段,所以service.retrieveData={Integer offset,Integer maxRows->..}起作用了