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

Java - Mocking soap call with SOAPMessage request

我正在尝试模拟一个返回 null 作为响应的 soap 调用。

我有一个 java class,我正在调用联邦快递 Web 服务来验证解析的地址。到这里一切都很好,但是当涉及到单元测试时,问题就出现了。 在测试中,我试图通过传递在实际 java class 中传递的相同请求参数来模拟 soap 调用,但是模拟将响应返回为 null,因为我传递的请求是与肥皂调用在 java class.

中的预期不同

Javaclass代码(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 class 获取字符串 xml 请求有效载荷并在测试 class 中使用假时钟附加新时间戳以匹配两个有效载荷但是它似乎是不同的。 一种方法是在像 -

这样的调用时给出通用的 soapmessage class
when(mockSoapConnection.call(any(SOAPMessage.class), anyString())).thenReturn(testResponse)

那么测试通过了,但这不是检查特定内容的正确方法 call.So 我如何了解有效负载之间的差异,或者是否有任何其他方法来模拟 soap 调用? ?

感谢任何帮助。

索拉布

如果您正在使用任何类型的匹配框架,例如 Mockito 所拥有的框架,请小心确保您在设置为预期的事物上确实具有平等性。例如,如果您的 SOAPMessage class 没有 equals 方法,那么模拟将无法工作,除非它获得与您的测试中使用的 testPayload 完全相同的实例。如果您在被测 class 中创建一个新的 SOAPMessage,并且没有 equals 方法或者 equals 方法会 return "false",那么它不会匹配并且它不会工作。

一般来说,如果您正在寻找模拟中的复杂功能,将您自己的 class 作为 测试替身 推出会更容易。首先创建接口的实现,检查相关参数,return如果它们存在则响应,并在添加更多要求时重构它。

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