0

我有一个定义如下的服务类

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

4

1 回答 1

0

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

given:
   ...
   service.retrieveData = { Integer offset, Integer maxRows ->
     ...
   }
于 2012-08-19T18:13:16.580 回答