Java Spock Mock的使用方法与Mockito相同

Java Spock Mock的使用方法与Mockito相同,java,groovy,mocking,mockito,spock,Java,Groovy,Mocking,Mockito,Spock,我有一个我用Mockito模拟的对象,我需要用Spock做同样的事情。 你们建议怎么做 这就是我对待莫基托的方式 XptoOutputBoundary xpto; doAnswer({ invocation -> xpto = invocation.getArgumentAt(1, OutputBoundary.class) xpto.response.response.abcd01 = abcd01

我有一个我用Mockito模拟的对象,我需要用Spock做同样的事情。 你们建议怎么做

这就是我对待莫基托的方式

        XptoOutputBoundary xpto;
        doAnswer({ invocation ->
            xpto = invocation.getArgumentAt(1, OutputBoundary.class)
            xpto.response.response.abcd01 = abcd01
            xpto.response.response.abcd02 = abcd02
            xpto.response.response.abcd03 = abcd03
            xpto.response.response.abcd04 = null
            xpto.response.response.abcd05 = null
            xpto.response.response.abcd06 = abcd06
            xpto.response.response.abcd07 = abcd07
            return null
        }).when(service).execute(any(), any())
我怎么能以同样的方式嘲笑,但使用斯波克

更新

你好!

我试过其中一个建议,但仍然不起作用。。。“xpto”对象使用spock不断变为null

下面是代码现在的状态:

        given: 'i have a valid object'
        AbcdObjectXptoResponse xptoResponse = Fixture.from(AbcdObjectXptoResponse.class).gimme("valid")
        AbcdObjectRequest request = Fixture.from(AbcdObjectRequest.class).gimme("valid")
        XptoOutputBoundary xpto;

        repository.execute(_ as XptoOutputBoundary, _) >> { args ->
            xpto = args[0] 
            xpto.response.response.abcd01 = abcd01
            xpto.response.response.abcd02 = abcd02
            xpto.response.response.abcd03 = abcd03
            xpto.response.response.abcd04 = null
            xpto.response.response.abcd05 = null
            xpto.response.response.abcd06 = abcd06
            xpto.response.response.abcd07 = abcd07
        }


        when: 'the request is performed'
        def response = service.getAbcdObjectRequest(request)

您的示例代码似乎是使用Mockito的Java风格的Groovy,出于某些特定原因返回
null
(而不是简单地为void)。在这个假设下,斯波克等价物是这样的:

MyService service = Mock()

def 'test case'() {
  when:
  'things happen'

  then:
  // you really should put constraints on your arguments, not just any() or _
  service.execute(_ as XptoOutputBoundary, _) >> { args ->
      XptoOutputBoundary xpto = args[0] // or 1?
      // do the same things
  }
}

请添加您尝试过的代码以及失败的原因(例如错误、堆栈跟踪、日志等),以便我们对其进行改进。您所做的似乎是接受类型为
OutputBoundary
的参数并对其进行变异;对吗?请更新问题,提供完整的而不是断章取义的代码片段。显示包含导入和包名称的完整类、所有受测类、依赖类和测试类。如果您重命名所有类和包并删除所有不需要重现您的情况的内容,则没有问题,但现在的情况是,您将浪费自己的时间和chrylis的时间,在多次迭代中进行讨论。我的意思是指导你如何提出更好的问题,而不是批评你,我希望你能理解@kriegaex完整的导入列表等,对于这里提出的问题来说并不是真正必要的。如果你不需要它,它对你很好。然而,这肯定会有帮助,并加快事情的进展,因为您不会在评论中与OP反复讨论,您的答案现在会被接受。这也将有助于我和其他人在没有任何猜测的情况下,在一分钟内重现情况并修复它。你在自己的回答中使用了“假设”这个词。嗨!非常感谢你的回答。我刚刚试着在测试中复制它,但是它不起作用。显然,它不会生成对象,所以我无法前进到动作。。。这就是我的测试现在是如何``给出一个有效的请求'服务的。执行(XptoOutputBoundary,)>{args->xpto=args[0]xpto.response.response.abcd02=abcd02 xpto.response.response.abcd04=null…当:'执行请求'其他服务时。getTheObjectThatIWant()…}“`你知道我在这件事上做错了什么吗?@Rodrigo我说的是
\uxptooutputbundary
,而不是
xptooutputbundary
;阅读斯波克关于编写交互的文档。你写的是“当
XptoOutputBoundary.class
作为第一个参数传递时”,这不是我想你想要的。谢谢@Chriylis!其实是我的错。我现在将其调整为相同的方式,它将抛出InvokerInjectException。。。我想这是因为我在填充de xpto.response之前调用了execute()方法object@Rodrigo在调用
execute
方法之前,不会调用闭包,而且交互通常应该进入
然后:
块。@Rodrigo如果你能用你当前的规范代码和你得到的新错误来更新你的问题,那会很有帮助。在注释中阅读较大的代码不是很好。