Java SpringWeb服务调用的Mockito模式

Java SpringWeb服务调用的Mockito模式,java,junit,mockito,spring-ws,Java,Junit,Mockito,Spring Ws,我测试的班级有这个方法 public SomeWebServiceResponse callDownstream(SomeWebServiceRequest request) { return (SomeWebServiceResponse ) super.callService(request); } 超级方法只是对SpringWS的一个调用,以简化的形式进行调用 response = getWebServiceTemplate().marshalSendAndReceive(th

我测试的班级有这个方法

public SomeWebServiceResponse callDownstream(SomeWebServiceRequest request)  {
    return (SomeWebServiceResponse ) super.callService(request);
}
超级方法只是对SpringWS的一个调用,以简化的形式进行调用

response = getWebServiceTemplate().marshalSendAndReceive(this.getBaseURL(), 
    request);
return response;
当我编写单元测试时,它试图进行实际的web服务调用。我不清楚该如何嘲笑,或者更确切地说,我们应该嘲笑什么

我应该从文件系统加载一个示例响应并在其中查找字符串吗?在这种情况下,我只是在测试文件加载


实际调用在基类中,我知道我们不能只模拟该方法。有什么建议吗?

正如@Duncan所说,如果可以的话,使用依赖注入组合将是一种方法,然后模拟这种依赖性


如果不能,那么可以使用mockito有选择地模拟测试中的类的方法。

Spring还提供模拟web服务服务器以及客户端请求的工具。中的第6.3章介绍了如何进行模拟

SpringWS-mocking工具改变了Web服务模板的行为,因此您可以在超类中调用该方法——该方法随后将调用SpringMock服务服务器

下面是Spring模拟服务服务器的单元测试示例:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-ws.xml"})
public class SetStatusFromSrsTemplateTest {
    @Autowired
    private WebServiceTemplate wsTemplate;

    @Before
    public void setUp() throws Exception {
        mockServer = MockWebServiceServer.createServer(wsTemplate);
    }

    @Test
    public void testCall() {
        SomeWebServiceRequest sampleRequest = new SomeWebServiceRequest();
        // add properties to the sampleRequest...
        Source expectedPayload = new ResourceSource(new ClassPathResource("exampleRequest.xml"));
        Source expectedResponse = new ResourceSource(new ClassPathResource("exampleResponse.xml"));
        mockServer.expect(payload(expectedPayload)).andRespond(withPayload(expectedResponse));
        instance.callDownStream(sampleRequest);
        mockServer.verify();
    }
}
上面的示例将使模拟服务服务器只期望一个具有给定负载的请求,并且(如果接收到的负载与预期负载匹配)使用给定的响应负载进行响应

但是,如果您只想验证在测试期间是否真正调用了超类中的方法,并且如果您对调用之后的消息交换不感兴趣,那么应该使用Mockito

如果你想使用Mockito,我建议你使用间谍(另见Kamlesh的答案)。例如


很抱歉我之前的评论。我想我不太明白这个问题。我将提供一个如何使用Spring mock service server进行单元测试的示例。模拟整个web服务,包括发送和接收消息(第一个代码示例),实际上不仅仅是一个单元测试——正如参考的Spring手册所指出的,这是一个集成测试。如果您只需要一个单元测试,那么您应该坚持使用Mockito(第二个代码示例)。你知道如何解决这个问题吗?
// Decorates this with the spy.
MyClass mySpy = spy(this);
// Change behaviour of callWebservice method to return specific response
doReturn(mockResponse).when(mySpy).callWebservice(any(SomeWebServiceRequest.class));
// invoke the method to be tested.
instance.callDownstream(request);
// verify that callWebService has been called
verify(mySpy, times(1)).callWebService(any(SomeWebServiceRequest.class));