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));