我正在尝试模拟一个肥皂调用,它返回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
答案 0 :(得分:0)
如果你正在使用像Mockito那样的任何匹配框架,那么要小心确保你确实在你所设定的事物中保持平等。例如,如果您的SOAPMessage
类没有equals
方法,则模拟将无效,除非它获得与您的测试中使用的testPayload
完全相同的实例。如果您正在测试的班级中创建一个新的SOAPMessage
,并且没有等于其他方法,或者equals方法会返回" false",那么它会赢得'匹配,它不会工作。
通常,如果您要在模拟中查找复杂功能,则可以更轻松地将自己的类作为 test double 推出。首先创建一个接口实现,检查相关参数,如果它们存在则返回响应,并在添加更多需求时重构它。
它可以是测试的内部类,但由于它跨越了集成/模块边界,您可能会发现它在其他地方有用,可以将其粘贴在自己的testHelpers
中文件夹或同等文件。