模拟标准计数api grails/groovy

模拟标准计数api grails/groovy,grails,groovy,mocking,Grails,Groovy,Mocking,我在尝试对服务类api进行单元测试时遇到问题 MyService.groovy MyTestClass.groovy 执行myMethod()时,上述测试方法的执行失败。它在线路上失败了 cr.count { isNull("column1") } 我在执行期间获得的堆栈跟踪: groovy.lang.MissingMethodException: No signature of method: com.MyService.isNull() is applicable for argume

我在尝试对服务类api进行单元测试时遇到问题

MyService.groovy

MyTestClass.groovy

执行myMethod()时,上述测试方法的执行失败。它在线路上失败了

cr.count {
  isNull("column1")
}
我在执行期间获得的堆栈跟踪:

groovy.lang.MissingMethodException: No signature of method: com.MyService.isNull() is applicable for argument types: (java.lang.String) values: [column1]
 Possible solutions: findAll(), findAll(groovy.lang.Closure), is(java.lang.Object), isCase(java.lang.Object) at
 org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:55) at 
 org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:78) at
 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
注意:如果我在这两个地方(服务类和测试类)都使用
cr.list
,那么相同的测试用例可以正常工作。我不知道为什么在计数过程中失败


任何想法都会帮上大忙。请提前感谢。

解决此问题的两种方法:

1-只需创建实例 因为可以模拟域类,所以创建与服务查询匹配的实例

@TestFor(MyService)
@Mock(MyDomain)
class MyServiceTests {
  void testService() {
    MyDomain instance = new MyDomain(...)
    assert instance.save(flush:true)
    def count = service.myMethod()
    assert 1 == count
  }
}
2-模拟grails.gorm.CriteriaBuilder
createCriteria()

@TestFor(MyService)
@Mock(MyDomain)
class MyDomainServiceTests {

  void testWithGroovyMock() {
    def mockedCriteria = new MockFor(CriteriaBuilder)
    mockedCriteria.demand.count(0..999) { Closure cls ->
      return 10
    }

    def count

    mockedCriteria.use {
      count = service.countWithIsNull()
    }

    assert 10 == count

  }

}
您可以找到有关Groovy MockFor的更多信息


还要注意,我使用的是Grails2.x声明单元测试(注释)的方式。

什么版本的Grails?我使用的是Grails2.2.0谢谢你。。。我试过你建议的方法。下面是我的codevoid testMyServiceMethod(){//mock域对象mockDomain(MyDomain)def mockedCriteria=new MockFor(CriteriaBuilder)mockedCriteria.demand.count(1..1){Closure cls->return 10}def count mockedCriteria.use{count=service.myServiceMethod()}assert 10==count}我得到的错误是:groovy.lang.MissingMethodException:没有方法的签名:com.domain.MyDomain.createCriteria()适用于参数类型:()值:[]可能的解决方案:位于sun.reflect.NativeConstructorAccessorImpl.newInstance0的createCriteria()(本机方法)位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)的sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)的java.lang.reflect.Constructor.newInstance(Constructor.java:513)您是否已将您的测试更改为使用
@TestFor
@Mock
?我在这里使用Grails 2.2.1进行了测试,它可以正常工作。我使用
@Mock
而不是
mockDomain(MyDomain)
和扩展的GrailsUnitTestCase。这有什么区别吗?我之所以这样做,是因为还有其他使用mockDomain(MyDomain)的测试用例,[instance list]),我使用MyDomain.list()来构建一些东西和测试一些其他功能。
@TestFor(MyService)
@Mock(MyDomain)
class MyServiceTests {
  void testService() {
    MyDomain instance = new MyDomain(...)
    assert instance.save(flush:true)
    def count = service.myMethod()
    assert 1 == count
  }
}
@TestFor(MyService)
@Mock(MyDomain)
class MyDomainServiceTests {

  void testWithGroovyMock() {
    def mockedCriteria = new MockFor(CriteriaBuilder)
    mockedCriteria.demand.count(0..999) { Closure cls ->
      return 10
    }

    def count

    mockedCriteria.use {
      count = service.countWithIsNull()
    }

    assert 10 == count

  }

}