mockito 如何为www.example.com创建单元测试SOAPConnection.call并模拟SOAPConnection?

plicqrtu  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(149)

欢迎指出我代码中的任何错误,因为这是我第一次使用SOAP和单元测试。
我有一个简单的SoapService,它创建SOAPConnection并发送SOAPMessage

    • SOAP服务. java**
public SOAPMessage sendSoapRequest(String url, String requestString) throws IOException, SOAPException {

    SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
    SOAPConnection soapConnection= soapConnectionFactory.createConnection();

    SOAPResponse soapResponse = soapConnection.call(getSoapMessage(requestString), url);
    soapConnection.close();

    return soapResponse;
}

我有sendSoapRequest的单元测试类

    • SOAP服务测试. java**
@SpringBootTest
@RunWith(SpringRunner.class)
public class SoapServiceTest {

    @Autowired
    SoapService soapService;

    @Mock
    SOAPConnection mockSoapConnection;

    private SOAPMessage mockSoapResponse = mock(SOAPMessage.class);

    @Test
    public void testSendSoapMessage() throws IOException, SOAPException{

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

        SOAPMessage soapResponse = soapService.sendSoapRequest("http://test.com/test.asmx", "SampleSoapRequestString...");

        Assert.assertNotNull(soapResponse);
        Assert.assertEquals(soapResponse,mockSoapResponse);
    }
}

参考代码
when(mockSoapConnection.call(any(SOAPMessage.class),anyString())).thenReturn(mockSoapResponse);
它应该返回mockSoapResponse,但它没有返回,它实际上试图在到达此行时将SOAPMessage发送到虚拟url "http://test.com/test.asmx"
SOAPResponse soapResponse = soapConnection.call(getSoapMessage(requestString), url);.
所以我的问题是
1.对"sendSoapRequest"进行单元测试的正确方法是什么?
1.这是模拟SOAPConnection并使用Mockito.when定义行为的正确方法吗?
1.我是否错过了模拟中的任何设置/配置?
我发现了一个相关问题,但它没有显示完整的设置:Java - Mocking soap call with SOAPMessage request
感谢您的任何意见/想法/指导,因为我真的不知道得到这个工作。谢谢。

vlf7wbxs

vlf7wbxs1#

您正在模拟的SOAPConnection不是您的方法中的SOAPConnection,这就是您所期望的结果没有发生的原因。
更详细地说,我认为您要测试的行在文档中是众所周知的,因此测试它们并不那么重要,更重要的是测试输入数据处理以成为您的调用的输入(在您的情况下为getSoapMessage(requestString))和输出数据处理,以成为调用者期望的输出(在您的例子中没有操作,但是也许您应该做一些事情来返回“使用客户端语言”的内容)。
调用的逻辑可以在“对方”的代码中进行测试。
最后,如果你想有一个更好的代码,你可以隔离所有的soap相关的行在一个合作者和模拟它,以测试输入和输出处理。

相关问题