【问题标题】:Mock is giving missing method exception in spock framewrok模拟在 spock 框架中给出缺少方法异常
【发布时间】:2017-12-08 10:17:06
【问题描述】:

我正在使用 spock 框架为我的 groovy 类运行我的 Junit 测试用例,我正在使用 Mock 来调用我的类。但它给了我MissingMethodException,但如果我通过正常创建对象def obj = new MyClass() 调用相同的方法,它正在工作。请让我知道我错过了什么吗?下面是我的堆栈跟踪

Expected no exception to be thrown, but got 'groovy.lang.MissingMethodException'
    at spock.lang.Specification.noExceptionThrown(Specification.java:119)
    at .AsplTest.fetchXmlTest(AsplTest.groovy:35)
Caused by: groovy.lang.MissingMethodException: No signature of method: com.webservice.Service.fetchAsplXml() is applicable for argument types: (java.lang.String, groovy.net.xmlrpc.XMLRPCServerProxy, java.lang.String) values: [3c98fa0dd1b5d92af599779bfb7be655, groovy.net.xmlrpc.XMLRPCServerProxy@797b0699, ...]
Possible solutions: getFetchAsplXml()
    at .AsplTest.fetchXmlTest(AsplTest.groovy:33)

下面是我的测试代码

public void fetchXmlTest() {
        given:
        def asplObject=Mock(Service);
        when:
        asplObject.fetchXml(sessionId, serverProxy, "https://serverproxy")
        then:
        noExceptionThrown()
    }

仅供参考: 我的 groovy 版本是 2.4.12 和 spock 版本 1.1-groovy-2.4

【问题讨论】:

  • 您正在模拟一个名为object 的变量,然后调用asplObject.fetchXml?试试object.fetchXml
  • 哦,对不起,这是我的错字。代码正确更新。更新了代码
  • 请提供完整的代码。显然,从您的错误消息中,我们需要知道com.webservice.Service.fetchAsplXml 和 sessionId, serverProxy 是什么。
  • 我认为Service 没有带有这些参数的方法
  • @tim_yates 它在那里是因为当我调用普通类对象时它正在工作

标签: unit-testing groovy spock


【解决方案1】:

在我看来,你做事倒退了。

模拟不是测试对象。它们用于控制测试对象与其他对象的交互。从您发布的代码看来,您希望在 Service 对象上测试方法 fetchXml 的调用。

为此,您需要创建一个 Service 实例,并调用该方法。如果您的服务有协作对象,那么您可以模拟它们并添加交互,如下所示:

given:
def service = new Service()

and:
service.collaboratingObject = Mock(CollaboratingObjectClass)


when:
service.getFetchAsplXml()

then:
1 * service.collaboratingObject.someMethodReturningAString(_ as String) >> {String input-> "mockedResult from $input" as String }

【讨论】:

  • 您好,您能告诉我通过在 spock 上下文中合作的意义吗?我想模拟的原因是我的方法从服务器下载大文件,所以在我的单元测试中我想避免这种情况
  • 您的服务是否完成了所有工作,或者它是否引用了完成其部分工作的其他服务?
  • 其他方法也有一些依赖
  • 如果服务没有保存对其他服务或注入的 spring bean 的引用的变量,那么就没有什么可模拟的了。我认为kyou的理解很肤浅,不仅是spock,还有grails和spring。很难帮你。
  • 你可能是..:(但我可以说有使用上下文加载器的spring bean注入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
相关资源
最近更新 更多