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 に答える