Java - 使用SOAPMessage请求模拟soap调用

时间:2018-05-17 17:02:31

标签: java unit-testing soap mockito junit4

我正在尝试模拟一个肥皂调用,它返回null作为响应。

我有一个java类,我正在调用fedex Web服务来验证解析的地址。直到这里一切都很好,但是当谈到单元测试时,问题就出现了。 在测试中我试图通过传递在实际java类中传递的相同请求参数来模拟soap调用,但是模拟将响应返回为null因为请求我传递的内容与soap调用的内容不同期待在java类中。

Java类代码(abc.java) -

SOAPMessage payload = getAddressRequestPayload();
SOAPMessage responseMessage = soapConnection.call(payload, settings.addressUrl());

测试代码(junit4) -

SOAPMessage testResponse = getMockResponse();
SOAPMessage testPayload =  abc.getAddressRequestPayload();

when(mockSoapConnection.call(testPayload, settings.addressUrl())).thenReturn(testResponse);

此外,我尝试从java类获取字符串xml请求有效负载,并在测试类中使用fakeclock附加新时间戳以匹配两个有效负载,但似乎不同。 一种方法是在调用时给出通用soapmessage类 -

when(mockSoapConnection.call(any(SOAPMessage.class), anyString())).thenReturn(testResponse)

然后测试正在通过,但这不是检查特定呼叫的正确方法。那么我如何才能知道有效负载之间的差异,还是有其他方法来模拟soap调用?

感谢任何帮助。

SAURABH

1 个答案:

答案 0 :(得分:0)

如果你正在使用像Mockito那样的任何匹配框架,那么要小心确保你确实在你所设定的事物中保持平等。例如,如果您的SOAPMessage类没有equals方法,则模拟将无效,除非它获得与您的测试中使用的testPayload完全相同的实例。如果您正在测试的班级中创建一个新的SOAPMessage,并且没有等于其他方法,或者equals方法会返回" false",那么它会赢得'匹配,它不会工作。

通常,如果您要在模拟中查找复杂功能,则可以更轻松地将自己的类作为 test double 推出。首先创建一个接口实现,检查相关参数,如果它们存在则返回响应,并在添加更多需求时重构它。

它可以是测试的内部类,但由于它跨越了集成/模块边界,您可能会发现它在其他地方有用,可以将其粘贴在自己的testHelpers中文件夹或同等文件。