Java Spock Mock的使用方法与Mockito相同
我有一个我用Mockito模拟的对象,我需要用Spock做同样的事情。 你们建议怎么做 这就是我对待莫基托的方式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
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如果你能用你当前的规范代码和你得到的新错误来更新你的问题,那会很有帮助。在注释中阅读较大的代码不是很好。