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->..}起作用了