/* * Copyright 2005-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.ws.test.client; import java.io.IOException; import java.net.URI; import java.util.Collections; import java.util.Locale; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.soap.MessageFactory; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import org.springframework.context.support.StaticApplicationContext; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.Resource; import org.springframework.ws.WebServiceMessage; import org.springframework.ws.client.core.WebServiceMessageCallback; import org.springframework.ws.client.core.WebServiceTemplate; import org.springframework.ws.client.core.support.WebServiceGatewaySupport; import org.springframework.ws.soap.SoapMessage; import org.springframework.ws.soap.client.SoapFaultClientException; import org.springframework.ws.soap.saaj.SaajSoapMessage; import org.springframework.ws.soap.saaj.SaajSoapMessageFactory; import org.springframework.xml.transform.StringResult; import org.springframework.xml.transform.StringSource; import org.junit.Before; import org.junit.Test; import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; import static org.easymock.EasyMock.*; import static org.junit.Assert.assertNotNull; import static org.springframework.ws.test.client.RequestMatchers.*; import static org.springframework.ws.test.client.ResponseCreators.withClientOrSenderFault; import static org.springframework.ws.test.client.ResponseCreators.withPayload; public class MockWebServiceServerTest { private WebServiceTemplate template; private MockWebServiceServer server; @Before public void setUp() throws Exception { template = new WebServiceTemplate(); template.setDefaultUri("http://example.com"); server = MockWebServiceServer.createServer(template); } @Test public void createServerWebServiceTemplate() throws Exception { WebServiceTemplate template = new WebServiceTemplate(); MockWebServiceServer server = MockWebServiceServer.createServer(template); assertNotNull(server); } @Test public void createServerGatewaySupport() throws Exception { MyClient client = new MyClient(); MockWebServiceServer server = MockWebServiceServer.createServer(client); assertNotNull(server); } @Test public void createServerApplicationContextWebServiceTemplate() throws Exception { StaticApplicationContext applicationContext = new StaticApplicationContext(); applicationContext.registerSingleton("webServiceTemplate", WebServiceTemplate.class); applicationContext.refresh(); MockWebServiceServer server = MockWebServiceServer.createServer(applicationContext); assertNotNull(server); } @Test public void createServerApplicationContextWebServiceGatewaySupport() throws Exception { StaticApplicationContext applicationContext = new StaticApplicationContext(); applicationContext.registerSingleton("myClient", MyClient.class); applicationContext.refresh(); MockWebServiceServer server = MockWebServiceServer.createServer(applicationContext); assertNotNull(server); } @Test(expected = IllegalArgumentException.class) public void createServerApplicationContextEmpty() throws Exception { StaticApplicationContext applicationContext = new StaticApplicationContext(); applicationContext.refresh(); MockWebServiceServer server = MockWebServiceServer.createServer(applicationContext); assertNotNull(server); } @Test public void mocks() throws Exception { URI uri = URI.create("http://example.com"); RequestMatcher requestMatcher1 = createStrictMock("requestMatcher1", RequestMatcher.class); RequestMatcher requestMatcher2 = createStrictMock("requestMatcher2", RequestMatcher.class); ResponseCreator responseCreator = createStrictMock(ResponseCreator.class); SaajSoapMessage response = new SaajSoapMessageFactory(MessageFactory.newInstance()).createWebServiceMessage(); requestMatcher1.match(eq(uri), isA(SaajSoapMessage.class)); requestMatcher2.match(eq(uri), isA(SaajSoapMessage.class)); expect(responseCreator.createResponse(eq(uri), isA(SaajSoapMessage.class), isA(SaajSoapMessageFactory.class))) .andReturn(response); replay(requestMatcher1, requestMatcher2, responseCreator); server.expect(requestMatcher1).andExpect(requestMatcher2).andRespond(responseCreator); template.sendSourceAndReceiveToResult(uri.toString(), new StringSource("<request xmlns='http://example.com'/>"), new StringResult()); verify(requestMatcher1, requestMatcher2, responseCreator); } @Test public void payloadMatch() throws Exception { Source request = new StringSource("<request xmlns='http://example.com'/>"); Source response = new StringSource("<response xmlns='http://example.com'/>"); server.expect(payload(request)).andRespond(withPayload(response)); StringResult result = new StringResult(); template.sendSourceAndReceiveToResult(request, result); assertXMLEqual(result.toString(), response.toString()); } @Test(expected = AssertionError.class) public void payloadNonMatch() throws Exception { Source expected = new StringSource("<request xmlns='http://example.com'/>"); server.expect(payload(expected)); StringResult result = new StringResult(); String actual = "<request xmlns='http://other.com'/>"; template.sendSourceAndReceiveToResult(new StringSource(actual), result); } @Test public void soapHeaderMatch() throws Exception { final QName soapHeaderName = new QName("http://example.com", "mySoapHeader"); server.expect(soapHeader(soapHeaderName)); template.sendSourceAndReceiveToResult(new StringSource("<request xmlns='http://example.com'/>"), new WebServiceMessageCallback() { public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException { SoapMessage soapMessage = (SoapMessage) message; soapMessage.getSoapHeader().addHeaderElement(soapHeaderName); } }, new StringResult()); } @Test(expected = AssertionError.class) public void soapHeaderNonMatch() throws Exception { QName soapHeaderName = new QName("http://example.com", "mySoapHeader"); server.expect(soapHeader(soapHeaderName)); template.sendSourceAndReceiveToResult(new StringSource("<request xmlns='http://example.com'/>"), new StringResult()); } @Test public void connectionMatch() throws Exception { String uri = "http://example.com"; server.expect(connectionTo(uri)); template.sendSourceAndReceiveToResult(uri, new StringSource("<request xmlns='http://example.com'/>"), new StringResult()); } @Test(expected = AssertionError.class) public void connectionNonMatch() throws Exception { String expected = "http://expected.com"; server.expect(connectionTo(expected)); String actual = "http://actual.com"; template.sendSourceAndReceiveToResult(actual, new StringSource("<request xmlns='http://example.com'/>"), new StringResult()); } @Test(expected = AssertionError.class) public void unexpectedConnection() throws Exception { Source request = new StringSource("<request xmlns='http://example.com'/>"); Source response = new StringSource("<response xmlns='http://example.com'/>"); server.expect(payload(request)).andRespond(withPayload(response)); template.sendSourceAndReceiveToResult(request, new StringResult()); template.sendSourceAndReceiveToResult(request, new StringResult()); } @Test public void xsdMatch() throws Exception { Resource schema = new ByteArrayResource( "<schema xmlns=\"http://www.w3.org/2001/XMLSchema\" targetNamespace=\"http://example.com\" elementFormDefault=\"qualified\"><element name=\"request\"/></schema>".getBytes()); server.expect(validPayload(schema)); StringResult result = new StringResult(); String actual = "<request xmlns='http://example.com'/>"; template.sendSourceAndReceiveToResult(new StringSource(actual), result); } @Test(expected = AssertionError.class) public void xsdNonMatch() throws Exception { Resource schema = new ByteArrayResource( "<schema xmlns=\"http://www.w3.org/2001/XMLSchema\" targetNamespace=\"http://example.com\" elementFormDefault=\"qualified\"><element name=\"request\"/></schema>".getBytes()); server.expect(validPayload(schema)); StringResult result = new StringResult(); String actual = "<request2 xmlns='http://example.com'/>"; template.sendSourceAndReceiveToResult(new StringSource(actual), result); } @Test public void xpathExistsMatch() throws Exception { final Map<String, String> ns = Collections.singletonMap("ns", "http://example.com"); server.expect(xpath("/ns:request", ns).exists()); template.sendSourceAndReceiveToResult(new StringSource("<request xmlns='http://example.com'/>"), new StringResult()); } @Test(expected = AssertionError.class) public void xpathExistsNonMatch() throws Exception { final Map<String, String> ns = Collections.singletonMap("ns", "http://example.com"); server.expect(xpath("/ns:foo", ns).exists()); template.sendSourceAndReceiveToResult(new StringSource("<request xmlns='http://example.com'/>"), new StringResult()); } @Test public void anythingMatch() throws Exception { Source request = new StringSource("<request xmlns='http://example.com'/>"); Source response = new StringSource("<response xmlns='http://example.com'/>"); server.expect(anything()).andRespond(withPayload(response)); StringResult result = new StringResult(); template.sendSourceAndReceiveToResult(request, result); assertXMLEqual(result.toString(), response.toString()); server.verify(); } @Test(expected = IllegalStateException.class) public void recordWhenReplay() throws Exception { Source request = new StringSource("<request xmlns='http://example.com'/>"); Source response = new StringSource("<response xmlns='http://example.com'/>"); server.expect(anything()).andRespond(withPayload(response)); server.expect(anything()).andRespond(withPayload(response)); StringResult result = new StringResult(); template.sendSourceAndReceiveToResult(request, result); assertXMLEqual(result.toString(), response.toString()); server.expect(anything()).andRespond(withPayload(response)); } @Test(expected = AssertionError.class) public void verifyFailure() throws Exception { server.expect(anything()); server.verify(); } @Test public void verifyOnly() throws Exception { server.verify(); } @Test(expected = SoapFaultClientException.class) public void fault() throws Exception { Source request = new StringSource("<request xmlns='http://example.com'/>"); server.expect(anything()).andRespond(withClientOrSenderFault("reason", Locale.ENGLISH)); StringResult result = new StringResult(); template.sendSourceAndReceiveToResult(request, result); } public static class MyClient extends WebServiceGatewaySupport { } }