Skip to content

Commit 5e73b4c

Browse files
authored
Allow usage of XMLUnit placeholders in request and response matchers. (#1417)
Signed-off-by: @corneil
1 parent 459df71 commit 5e73b4c

File tree

7 files changed

+66
-3
lines changed

7 files changed

+66
-3
lines changed

spring-ws-test/pom.xml

+6
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@
5151
</exclusions>
5252
</dependency>
5353

54+
<dependency>
55+
<groupId>org.xmlunit</groupId>
56+
<artifactId>xmlunit-placeholders</artifactId>
57+
<version>${xmlunit.version}</version>
58+
</dependency>
59+
5460
<dependency>
5561
<groupId>org.springframework</groupId>
5662
<artifactId>spring-test</artifactId>

spring-ws-test/src/main/java/org/springframework/ws/test/support/matcher/xmlunit2/PayloadDiffMatcher.java

+4
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import org.w3c.dom.Document;
2929
import org.xmlunit.builder.DiffBuilder;
3030
import org.xmlunit.diff.Diff;
31+
import org.xmlunit.diff.DifferenceEvaluators;
32+
import org.xmlunit.placeholder.PlaceholderDifferenceEvaluator;
3133

3234
/**
3335
* Matches {@link Source} payloads.
@@ -68,6 +70,8 @@ protected Diff createDiff(Source payload) {
6870
return DiffBuilder.compare(expectedDocument) //
6971
.withTest(actualDocument) //
7072
.ignoreWhitespace() //
73+
.withDifferenceEvaluator(
74+
DifferenceEvaluators.chain(new PlaceholderDifferenceEvaluator(), DifferenceEvaluators.Default))
7175
.checkForSimilar() //
7276
.build();
7377
}

spring-ws-test/src/main/java/org/springframework/ws/test/support/matcher/xmlunit2/SoapEnvelopeDiffMatcher.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import org.w3c.dom.Document;
3333
import org.xmlunit.builder.DiffBuilder;
3434
import org.xmlunit.diff.Diff;
35+
import org.xmlunit.diff.DifferenceEvaluators;
36+
import org.xmlunit.placeholder.PlaceholderDifferenceEvaluator;
3537

3638
/**
3739
* Matches {@link Source} SOAP envelopes.
@@ -56,7 +58,12 @@ protected void match(SoapMessage soapMessage) throws IOException, AssertionError
5658

5759
Document actualDocument = soapMessage.getDocument();
5860
Document expectedDocument = createDocumentFromSource(expected);
59-
Diff diff = DiffBuilder.compare(expectedDocument).ignoreWhitespace().withTest(actualDocument).checkForSimilar()
61+
Diff diff = DiffBuilder.compare(expectedDocument)
62+
.ignoreWhitespace()
63+
.withTest(actualDocument)
64+
.withDifferenceEvaluator(
65+
DifferenceEvaluators.chain(new PlaceholderDifferenceEvaluator(), DifferenceEvaluators.Default))
66+
.checkForSimilar()
6067
.build();
6168
assertTrue("Envelopes are different, " + diff.toString(), !diff.hasDifferences());
6269
}

spring-ws-test/src/test/java/org/springframework/ws/test/support/matcher/xmlunit2/PayloadDiffMatcherTest.java

+15
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,21 @@ public void match() {
4343
verify(message);
4444
}
4545

46+
@Test
47+
public void matchWithXmlIgnore() {
48+
49+
var xml = "<element xmlns='http://example.com'>%s</element>";
50+
WebServiceMessage message = createMock(WebServiceMessage.class);
51+
52+
expect(message.getPayloadSource()).andReturn(new StringSource(xml.formatted("1234"))).times(2);
53+
replay(message);
54+
55+
var matcher = new PayloadDiffMatcher(new StringSource(xml.formatted("${xmlunit.ignore}")));
56+
matcher.match(message);
57+
58+
verify(message);
59+
}
60+
4661
@Test
4762
public void matchIgnoringWhitespace() {
4863

spring-ws-test/src/test/java/org/springframework/ws/test/support/matcher/xmlunit2/SoapEnvelopeDiffMatcherTest.java

+25
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.easymock.EasyMock.replay;
2323
import static org.easymock.EasyMock.verify;
2424

25+
import javax.xml.transform.TransformerException;
2526
import javax.xml.transform.dom.DOMResult;
2627

2728
import org.junit.jupiter.api.Test;
@@ -30,6 +31,8 @@
3031
import org.springframework.xml.transform.TransformerHelper;
3132
import org.w3c.dom.Document;
3233

34+
import java.io.IOException;
35+
3336
public class SoapEnvelopeDiffMatcherTest {
3437

3538
@Test
@@ -76,4 +79,26 @@ public void nonMatch() {
7679
matcher.match(message);
7780
});
7881
}
82+
83+
@Test
84+
public void matchWithXmlIgnore() throws TransformerException, IOException {
85+
String xml = """
86+
<?xml version='1.0'?>
87+
<soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope'>
88+
<soap:Header><header xmlns='http://example.com'/></soap:Header>
89+
<soap:Body><payload xmlns='http://example.com'>%s</payload></soap:Body>
90+
</soap:Envelope>""";
91+
92+
String actual = String.format(xml, "1");
93+
DOMResult result = new DOMResult();
94+
TransformerHelper transformerHelper = new TransformerHelper();
95+
transformerHelper.transform(new StringSource(actual), result);
96+
SoapMessage message = createMock(SoapMessage.class);
97+
expect(message.getDocument()).andReturn((Document) result.getNode()).once();
98+
replay(message);
99+
100+
String expected = String.format(xml, "${xmlunit.ignore}");
101+
SoapEnvelopeDiffMatcher matcher = new SoapEnvelopeDiffMatcher(new StringSource(expected));
102+
matcher.match(message);
103+
}
79104
}

src/main/asciidoctor/client.adoc

+4-1
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ The `RequestMatchers` class provides the following request matchers:
457457
| Expects any sort of request.
458458

459459
| `payload()`
460-
| Expects a given request payload.
460+
| Expects a given request payload. May include https://github.com/xmlunit/user-guide/wiki/Placeholders[XMLUnit Placeholders]
461461

462462
| `validPayload()`
463463
| Expects the request payload to validate against given XSD schemas.
@@ -468,6 +468,9 @@ The `RequestMatchers` class provides the following request matchers:
468468
| `soapHeader()`
469469
| Expects a given SOAP header to exist in the request message.
470470

471+
| `soapEnvelope()`
472+
| Expects a given SOAP payload. May include https://github.com/xmlunit/user-guide/wiki/Placeholders[XMLUnit Placeholders]
473+
471474
| `connectionTo()`
472475
| Expects a connection to the given URL.
473476
|===

src/main/asciidoctor/server.adoc

+4-1
Original file line numberDiff line numberDiff line change
@@ -1244,7 +1244,7 @@ The `ResponseMatchers` class provides the following response matchers:
12441244
| Description
12451245

12461246
| `payload()`
1247-
| Expects a given response payload.
1247+
| Expects a given response payload. May include https://github.com/xmlunit/user-guide/wiki/Placeholders[XMLUnit Placeholders].
12481248

12491249
| `validPayload()`
12501250
| Expects the response payload to validate against given XSD schemas.
@@ -1255,6 +1255,9 @@ The `ResponseMatchers` class provides the following response matchers:
12551255
| `soapHeader()`
12561256
| Expects a given SOAP header to exist in the response message.
12571257

1258+
| `soapEnvelope()`
1259+
| Expects a given SOAP payload. May include https://github.com/xmlunit/user-guide/wiki/Placeholders[XMLUnit Placeholders].
1260+
12581261
| `noFault()`
12591262
| Expects that the response message does not contain a SOAP Fault.
12601263

0 commit comments

Comments
 (0)