Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法让GroovyMock(在Spock中)接受GString作为字符串参数?_Groovy_Mocking_Spock - Fatal编程技术网

有没有办法让GroovyMock(在Spock中)接受GString作为字符串参数?

有没有办法让GroovyMock(在Spock中)接受GString作为字符串参数?,groovy,mocking,spock,Groovy,Mocking,Spock,不幸的是,我还没有找到任何关于这个话题的有用信息 我有一些Spock测试,其中我需要使用GroovyMock而不是Mock——因为它支持模拟动态方法 其中一个(非动态)方法采用字符串参数。有时,GString作为参数传递给该方法。这在生产性代码和Mock中都可以正常工作 但是,在切换到GroovyMock之后,我得到了一个java.lang.IllegalArgumentException:argument type mismatch异常,将我指向以下行(参见下面的示例): 我已经检查了在创建G

不幸的是,我还没有找到任何关于这个话题的有用信息

我有一些Spock测试,其中我需要使用
GroovyMock
而不是
Mock
——因为它支持模拟动态方法

其中一个(非动态)方法采用字符串参数。有时,GString作为参数传递给该方法。这在生产性代码和
Mock
中都可以正常工作

但是,在切换到
GroovyMock
之后,我得到了一个
java.lang.IllegalArgumentException:argument type mismatch
异常,将我指向以下行(参见下面的示例):

我已经检查了在创建
GroovyMock
期间可用的一些选项是否有帮助。到目前为止,我尝试了
verified
选项-不幸的是,这没有起到任何作用。其他选项在这里似乎都没有用处,因此我没有尝试使用它们(对于大多数选项,我甚至不知道如何使用它们)

请检查以下小示例以供参考:

import spock.lang.Specification

class SomeClass {
    String someMethod(String arg) {
        return arg
    }
}

class TestClass {
    SomeClass someClass

    String callMethod() {
        someClass.someMethod("foo ${1 + 1}")
    }
}

class FooSpec extends Specification {
    def 'pass String to groovyMock mocked method taking a String argument'() {
        given:
        TestClass testClass = new TestClass()
        SomeClass someClass = GroovyMock() // does not work
        // SomeClass someClass = Mock() // test works if used instead of the previous line
        testClass.someClass = someClass

        when:
        testClass.callMethod()

        then:
        1 * someClass.someMethod(_)
    }
}

接得好!我可以在Spock
1.3-groovy-2.5
2.0-M3-groovy-3.0
中确认这种行为。我认为创建一个链接并从那里返回到这个问题是有意义的

我已经调试到这个问题中,并在它被“清理”以用于测试错误报告之前打印了堆栈跟踪。您可能希望将其添加到新版本中:

java.lang.IllegalArgumentException:参数类型不匹配
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:104)
位于org.spockframework.mock.runtime.GroovyMockMetaClass.doInvokeMethod(GroovyMockMetaClass.java:83)
位于org.spockframework.mock.runtime.GroovyMockMetaClass.invokeMethod(GroovyMockMetaClass.java:39)
位于org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:41)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
在de.scrum_master.stackoverflow.q63797837.TestClass.callMethod(FooSpec.groovy:15)中
在de.scrum_master.stackoverflow.q63797837.TestClass$callMethod.call(未知源)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:119)
在de.scrum_master.stackoverflow.q63797837.FooSpec.$spock_feature_0_0(FooSpec.groovy:28)
... 34多

更新:还有一个发现:如果将目标方法签名更改为
stringsomethod(GString arg)
,则测试通过GroovyMock。因此,问题可能与将
someClass.someMethod(“foo${1+1}”)
中使用的
GString
转换为
字符串有关


更新2020-09-16:几天前,我代表您创建了一个项目,因为您忽略了我的建议,没有亲自创建项目。该漏洞已经修复,我希望它在下一个2.0里程碑版本中可用,当然也在最终版本中可用。

更新:已修复,请参阅我的答案更新。
import spock.lang.Specification

class SomeClass {
    String someMethod(String arg) {
        return arg
    }
}

class TestClass {
    SomeClass someClass

    String callMethod() {
        someClass.someMethod("foo ${1 + 1}")
    }
}

class FooSpec extends Specification {
    def 'pass String to groovyMock mocked method taking a String argument'() {
        given:
        TestClass testClass = new TestClass()
        SomeClass someClass = GroovyMock() // does not work
        // SomeClass someClass = Mock() // test works if used instead of the previous line
        testClass.someClass = someClass

        when:
        testClass.callMethod()

        then:
        1 * someClass.someMethod(_)
    }
}