模拟标准计数api grails/groovy
我在尝试对服务类api进行单元测试时遇到问题 MyService.groovy MyTestClass.groovy 执行myMethod()时,上述测试方法的执行失败。它在线路上失败了模拟标准计数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
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
}
}