首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy测试groovy.sql.Sql

Groovy测试groovy.sql.Sql
EN

Stack Overflow用户
提问于 2013-09-16 18:12:10
回答 1查看 1.8K关注 0票数 2

我有一个想要测试的服务,如下所示:

代码语言:javascript
复制
class MyService {
    def dataSource

    def method1(id) {
        Sql sql = Sql.newInstance(dataSource)
        def query = "select * from some_table where id = ?"
        sql.eachRow(query, [id]) { row ->
            // do stuff with row
        }
    }
}

我正在尝试用MockFor来测试这一点

代码语言:javascript
复制
class MyServiceTest extends GroovyTestCase {
    @Test
    void testMethod1() {
        def mockResults = [
            [ id:1, name:"foo", ...]
        ]
        def mockSql = new MockFor(Sql.class)
        mockSql.demand.newInstance { mockSql }
        mockSql.demand.eachRow { query, params, closure ->
            // run the closure over the mock array
            mockResults.each(closure)
        }

        mockSql.use {
            MyService myService = new MyService()
            myService.method1(1)
        }
    }
}

但我得到了以下异常:

代码语言:javascript
复制
junit.framework.AssertionFailedError: No call to 'newInstance' expected at this point. Still 1 call(s) to 'eachRow' expected.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77)
    at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:71)
    at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrap.callConstructor(ConstructorSite.java:81)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:57)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:182)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:190)
    at groovy.mock.interceptor.StrictExpectation.match(StrictExpectation.groovy:56)
    at groovy.mock.interceptor.StrictExpectation$match.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at groovy.mock.interceptor.MockInterceptor.beforeInvoke(MockInterceptor.groovy:31)
    at groovy.mock.interceptor.MockProxyMetaClass.invokeStaticMethod(MockProxyMetaClass.java:98)
    at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call(StaticMetaClassSite.java:50)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at com.bnpparibas.client1st.service.MetricsService.getClientDocumentsStatistic(MetricsService.groovy:483)
    at com.bnpparibas.client1st.service.MetricsService$getClientDocumentsStatistic.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128)
    at MyServiceTest$_testMethod1_closure
EN

回答 1

Stack Overflow用户

发布于 2013-09-16 18:47:56

我认为你对newInstance方法的模仿是不正确的。应该是:

代码语言:javascript
复制
mockSql.demand.newInstance { def datasource->
    return mockSql 
}

eachRow方法也是如此。在每个闭包参数之前添加def

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18825457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档