【问题标题】:Java - Mocking soap call with SOAPMessage requestJava - 使用 SOAPMessage 请求模拟肥皂调用
【发布时间】:2018-05-17 17:02:31
【问题描述】:

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

我有一个 java 类,我在其中调用 fedex Web 服务以验证解析后的地址。到这里一切都很好,但是当涉及到单元测试时,问题就出现了。 在测试中,我试图通过传递在实际java类中传递的相同请求参数来模拟soap调用,但是由于我传递的请求与soap调用不同,mock将响应返回为null期待在 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调用??

感谢任何帮助。

苏拉布

【问题讨论】:

  • 有点混淆你在问什么,所以似乎使用最后一个代码你能够使测试通过,但是你想测试你在其中一个参数中接收到哪个值?
  • 我的问题是,如果您要验证用作第二个参数的字符串是否是特定的,或者您正在尝试测试测试有效负载是否包含某些内容?
  • 第一件事是我试图用实际的请求负载来模拟soap调用,但这不是明智的做法,因为soapMessage实例每次都会不同。

标签: java unit-testing soap mockito junit4


【解决方案1】:

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

一般来说,如果您在模拟中寻找复杂的功能,将您自己的类推出为 测试替身 会更容易。首先创建一个接口实现,该接口检查相关参数并在存在时返回响应,并在添加更多需求时对其进行重构。

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

【讨论】:

  • 我认为这是非常有用的建议,刚刚来到 SoapMessage 没有任何相等函数,该类每次调用时都会创建一个新实例 msg,所以我必须转换两个请求有效载荷到字符串,然后比较它等于:) 所以这是我唯一可行的解​​决方案,因为断言与实际调用使用的请求有效载荷相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多