如何模拟闭包方法

时间:2012-08-19 16:18:00

标签: grails mocking

我有一个服务类定义如下

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闭包,想知道什么是模拟闭包方法的正确方法..

1 个答案:

答案 0 :(得分:0)

似乎是因为retrieveData是一个字段,而不是一个方法。你能尝试一下:

given:
   ...
   service.retrieveData = { Integer offset, Integer maxRows ->
     ...
   }