diff --git a/test/src/main/java/org/springframework/ws/test/client/RequestMatchers.java b/test/src/main/java/org/springframework/ws/test/client/RequestMatchers.java index 124fed94..782dc6f9 100644 --- a/test/src/main/java/org/springframework/ws/test/client/RequestMatchers.java +++ b/test/src/main/java/org/springframework/ws/test/client/RequestMatchers.java @@ -27,6 +27,7 @@ import org.springframework.util.Assert; import org.springframework.ws.WebServiceMessage; import org.springframework.ws.test.support.matcher.PayloadDiffMatcher; import org.springframework.ws.test.support.matcher.SchemaValidatingMatcher; +import org.springframework.ws.test.support.matcher.SoapHeaderMatcher; import org.springframework.ws.test.support.matcher.WebServiceMessageMatcher; import org.springframework.xml.transform.ResourceSource; @@ -116,7 +117,7 @@ public abstract class RequestMatchers { */ public static RequestMatcher soapHeader(QName soapHeaderName) { Assert.notNull(soapHeaderName, "'soapHeaderName' must not be null"); - return new SoapHeaderMatcher(soapHeaderName); + return new WebServiceMessageMatcherAdapter(new SoapHeaderMatcher(soapHeaderName)); } /** @@ -142,7 +143,7 @@ public abstract class RequestMatchers { } /** - * Adapts a {@link org.springframework.ws.test.support.matcher.WebServiceMessageMatcher} to the {@link RequestMatcher} contract. + * Adapts a {@link WebServiceMessageMatcher} to the {@link RequestMatcher} contract. */ private static class WebServiceMessageMatcherAdapter implements RequestMatcher { diff --git a/test/src/main/java/org/springframework/ws/test/support/matcher/AbstractSoapMessageMatcher.java b/test/src/main/java/org/springframework/ws/test/support/matcher/AbstractSoapMessageMatcher.java new file mode 100644 index 00000000..795da1a9 --- /dev/null +++ b/test/src/main/java/org/springframework/ws/test/support/matcher/AbstractSoapMessageMatcher.java @@ -0,0 +1,51 @@ +/* + * 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.support.matcher; + +import java.io.IOException; + +import org.springframework.ws.WebServiceMessage; +import org.springframework.ws.soap.SoapMessage; + +import static org.springframework.ws.test.support.AssertionErrors.assertTrue; + +/** + * Abstract base class for SOAP-specific {@link WebServiceMessageMatcher} implementations. + *

+ * Asserts that the message given to {@link #match(WebServiceMessage)} is a {@link SoapMessage}, and invokes {@link + * #match(SoapMessage)} with it if so. + * + * @author Arjen Poutsma + * @since 2.0 + */ +public abstract class AbstractSoapMessageMatcher implements WebServiceMessageMatcher { + + public final void match(WebServiceMessage message) throws IOException, AssertionError { + assertTrue("Message is not a SOAP message", message instanceof SoapMessage); + match((SoapMessage) message); + } + + /** + * Abstract template method that gets invoked from {@link #match(WebServiceMessage)} if the given message is a + * {@link SoapMessage}. + * + * @param soapMessage the soap message + * @throws IOException in case of I/O errors + * @throws AssertionError if expectations are not met + */ + protected abstract void match(SoapMessage soapMessage) throws IOException, AssertionError; +} diff --git a/test/src/main/java/org/springframework/ws/test/client/SoapHeaderMatcher.java b/test/src/main/java/org/springframework/ws/test/support/matcher/SoapHeaderMatcher.java similarity index 69% rename from test/src/main/java/org/springframework/ws/test/client/SoapHeaderMatcher.java rename to test/src/main/java/org/springframework/ws/test/support/matcher/SoapHeaderMatcher.java index 4dd31de3..7cf20a07 100644 --- a/test/src/main/java/org/springframework/ws/test/client/SoapHeaderMatcher.java +++ b/test/src/main/java/org/springframework/ws/test/support/matcher/SoapHeaderMatcher.java @@ -14,20 +14,18 @@ * limitations under the License. */ -package org.springframework.ws.test.client; +package org.springframework.ws.test.support.matcher; import java.io.IOException; -import java.net.URI; import java.util.Iterator; import javax.xml.namespace.QName; -import org.springframework.ws.WebServiceMessage; +import org.springframework.util.Assert; import org.springframework.ws.soap.SoapHeader; import org.springframework.ws.soap.SoapHeaderElement; import org.springframework.ws.soap.SoapMessage; import static org.springframework.ws.test.support.AssertionErrors.assertTrue; -import static org.springframework.ws.test.support.AssertionErrors.fail; /** * Matches SOAP headers. @@ -35,25 +33,26 @@ import static org.springframework.ws.test.support.AssertionErrors.fail; * @author Arjen Poutsma * @since 2.0 */ -class SoapHeaderMatcher implements RequestMatcher { +public class SoapHeaderMatcher extends AbstractSoapMessageMatcher { private final QName soapHeaderName; - SoapHeaderMatcher(QName soapHeaderName) { + /** + * Creates a new instance of the {@code SoapHeaderMatcher} that checks for the presence of the given SOAP header + * name. + * + * @param soapHeaderName the header name to check for + */ + public SoapHeaderMatcher(QName soapHeaderName) { + Assert.notNull(soapHeaderName, "'soapHeaderName' must not be null"); this.soapHeaderName = soapHeaderName; } - public void match(URI uri, WebServiceMessage request) throws IOException, AssertionError { - if (!(request instanceof SoapMessage)) { - fail("Request message is not a SOAP message"); - return; - } - SoapMessage soapMessage = (SoapMessage) request; + @Override + protected void match(SoapMessage soapMessage) throws IOException, AssertionError { SoapHeader soapHeader = soapMessage.getSoapHeader(); - if (soapHeader == null) { - fail("SOAP message [" + soapMessage + "] does not contain SOAP header"); - return; - } + assertTrue("SOAP message [" + soapMessage + "] does not contain SOAP header", soapHeader != null); + Iterator soapHeaderElementIterator = soapHeader.examineAllHeaderElements(); boolean found = false; while (soapHeaderElementIterator.hasNext()) { diff --git a/test/src/test/java/org/springframework/ws/test/client/SoapHeaderMatcherTest.java b/test/src/test/java/org/springframework/ws/test/support/matcher/SoapHeaderMatcherTest.java similarity index 92% rename from test/src/test/java/org/springframework/ws/test/client/SoapHeaderMatcherTest.java rename to test/src/test/java/org/springframework/ws/test/support/matcher/SoapHeaderMatcherTest.java index 04d7a4ae..caa13b97 100644 --- a/test/src/test/java/org/springframework/ws/test/client/SoapHeaderMatcherTest.java +++ b/test/src/test/java/org/springframework/ws/test/support/matcher/SoapHeaderMatcherTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ws.test.client; +package org.springframework.ws.test.support.matcher; import javax.xml.namespace.QName; import javax.xml.soap.MessageFactory; @@ -48,7 +48,7 @@ public class SoapHeaderMatcherTest { saajMessage.getSOAPHeader().addHeaderElement(expectedHeaderName); SoapMessage soapMessage = new SaajSoapMessage(saajMessage); - matcher.match(null, soapMessage); + matcher.match(soapMessage); } @Test(expected = AssertionError.class) @@ -57,14 +57,14 @@ public class SoapHeaderMatcherTest { SOAPMessage saajMessage = messageFactory.createMessage(); SoapMessage soapMessage = new SaajSoapMessage(saajMessage); - matcher.match(null, soapMessage); + matcher.match(soapMessage); } @Test(expected = AssertionError.class) public void nonSoap() throws Exception { WebServiceMessage message = createMock(WebServiceMessage.class); - matcher.match(null, message); + matcher.match(message); } } \ No newline at end of file