Unit testing Grails单元测试-使用每个闭包模拟findAllBy()方法

Unit testing Grails单元测试-使用每个闭包模拟findAllBy()方法,unit-testing,grails,groovy,mockito,spock,Unit Testing,Grails,Groovy,Mockito,Spock,我想在服务类中对函数进行单元测试 服务类如下所示: class FooService{ Double getFoo(SomeClass class){ Double returningValue = 0.0 String parameter SomeClass.findAllByCodeLike(parameter).each{ Double amount = someOtherFooServiceMethod(it,it

我想在服务类中对函数进行单元测试

服务类如下所示:

    class FooService{ 

    Double getFoo(SomeClass class){
      Double returningValue = 0.0
      String parameter

      SomeClass.findAllByCodeLike(parameter).each{
        Double amount = someOtherFooServiceMethod(it,it.someClassAttribute?.intValue())
        if(amount){
         returningValue += amount;
         }
       }
     }

    }



我知道如何模拟SomeClass.findAllByCodeLike(参数)。我用SomeClass.metaClass.static.findAllByCodeLike()模拟了它,并为这个函数赋值

但我不知道如何嘲笑每一个{}。 有办法吗


到目前为止,我正在模拟许多域类来测试这个方法,并将域类保存到内存数据库中。如果我找到一种模拟SomeClass.findAllByCodeLike(parameter).each{…}的方法,我可以通过大量代码减少TestClass。

您不必模拟
each{}
。您只需让您的
findallbycode-like
mock返回一个值列表:

SomeClass.metaClass.static.findAllByCodeLike = { code -> [ new SomeClass(...), new SomeClass(...), ... ] }
//...
SomeClass.findAllByCodeLike(parameter).each{ 
  doStuff it
}

警告:如果在通过元类模拟静态方法的测试方法之后还有另一个测试方法,并且后一个测试方法期望原始静态方法存在,那么您将陷入麻烦,因为您在一个测试中所做的将渗透到下一个测试中。所以一定要清理你的测试夹具。在Spock中,您将执行
setup:def originalMetaClass=SomeClass.metaClass
,最后在JUnit中以另一种方式执行类似的操作
cleanup:SomeClass.metaClass=originalMetaClass