diff --git a/rest-assured-tutorial/src/test/java/com/baeldung/restassured/RestAssuredTest.java b/rest-assured-tutorial/src/test/java/com/baeldung/restassured/RestAssuredTest.java
index e971efe3cb..06f54aae24 100644
--- a/rest-assured-tutorial/src/test/java/com/baeldung/restassured/RestAssuredTest.java
+++ b/rest-assured-tutorial/src/test/java/com/baeldung/restassured/RestAssuredTest.java
@@ -45,7 +45,7 @@ public class RestAssuredTest {
}
@Test
- public void givenUrl_whenSuccessOnGetsResponse_andJsonHasRequiredKV_thenCorrect() {
+ public void givenUrl_whenSuccessOnGetsResponseAndJsonHasRequiredKV_thenCorrect() {
get("/events?id=390").then().statusCode(200).assertThat()
.body("id", equalTo("390"));
diff --git a/xmlunit2-tutorial/README.md b/xmlunit2-tutorial/README.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/xmlunit2-tutorial/pom.xml b/xmlunit2-tutorial/pom.xml
new file mode 100644
index 0000000000..b4cb684f65
--- /dev/null
+++ b/xmlunit2-tutorial/pom.xml
@@ -0,0 +1,46 @@
+
+ 4.0.0
+ com.baeldung
+ xmlunit2-tutorial
+ 1.0
+ XMLUnit-2
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.3
+
+ 7
+ 7
+
+
+
+
+
+
+ junit
+ junit
+ 4.3
+ test
+
+
+ org.hamcrest
+ hamcrest-all
+ 1.3
+
+
+ org.xmlunit
+ xmlunit-matchers
+ 2.2.1
+
+
+
+ org.xmlunit
+ xmlunit-core
+ 2.2.1
+
+
+
+
diff --git a/xmlunit2-tutorial/src/main/java/com/baeldung/xmlunit/IgnoreAttributeDifferenceEvaluator.java b/xmlunit2-tutorial/src/main/java/com/baeldung/xmlunit/IgnoreAttributeDifferenceEvaluator.java
new file mode 100644
index 0000000000..2f644e0114
--- /dev/null
+++ b/xmlunit2-tutorial/src/main/java/com/baeldung/xmlunit/IgnoreAttributeDifferenceEvaluator.java
@@ -0,0 +1,31 @@
+package com.baeldung.xmlunit;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+import org.xmlunit.diff.Comparison;
+import org.xmlunit.diff.ComparisonResult;
+import org.xmlunit.diff.DifferenceEvaluator;
+
+public class IgnoreAttributeDifferenceEvaluator implements DifferenceEvaluator {
+
+ private String attributeName;
+
+ public IgnoreAttributeDifferenceEvaluator(String attributeName) {
+ this.attributeName = attributeName;
+ }
+
+ @Override
+ public ComparisonResult evaluate(Comparison comparison,
+ ComparisonResult outcome) {
+ if (outcome == ComparisonResult.EQUAL)
+ return outcome;
+ final Node controlNode = comparison.getControlDetails().getTarget();
+ if (controlNode instanceof Attr) {
+ Attr attr = (Attr) controlNode;
+ if (attr.getName().equals(attributeName)) {
+ return ComparisonResult.SIMILAR;
+ }
+ }
+ return outcome;
+ }
+}
diff --git a/xmlunit2-tutorial/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java b/xmlunit2-tutorial/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java
new file mode 100644
index 0000000000..d0e099e591
--- /dev/null
+++ b/xmlunit2-tutorial/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java
@@ -0,0 +1,290 @@
+package com.baeldung.xmlunit;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.xmlunit.matchers.CompareMatcher.isIdenticalTo;
+import static org.xmlunit.matchers.CompareMatcher.isSimilarTo;
+import static org.xmlunit.matchers.HasXPathMatcher.hasXPath;
+
+import java.io.File;
+import java.util.Iterator;
+
+import org.junit.Test;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.xmlunit.builder.DiffBuilder;
+import org.xmlunit.builder.Input;
+import org.xmlunit.diff.ComparisonControllers;
+import org.xmlunit.diff.DefaultNodeMatcher;
+import org.xmlunit.diff.Diff;
+import org.xmlunit.diff.Difference;
+import org.xmlunit.diff.ElementSelectors;
+import org.xmlunit.validation.Languages;
+import org.xmlunit.validation.ValidationProblem;
+import org.xmlunit.validation.ValidationResult;
+import org.xmlunit.validation.Validator;
+import org.xmlunit.xpath.JAXPXPathEngine;
+
+public class XMLUnitTest {
+ @Test
+ public void givenWrongXml_whenValidateFailsAgainstXsd_thenCorrect() {
+ Validator v = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
+ v.setSchemaSource(Input.fromStream(
+ new XMLUnitTest().getClass().getResourceAsStream(
+ "/students.xsd")).build());
+ ValidationResult r = v.validateInstance(Input.fromStream(
+ new XMLUnitTest().getClass().getResourceAsStream(
+ "/students_with_error.xml")).build());
+ assertFalse(r.isValid());
+ }
+
+ @Test
+ public void givenXmlWithErrors_whenReturnsValidationProblems_thenCorrect() {
+ Validator v = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
+ v.setSchemaSource(Input.fromStream(
+ new XMLUnitTest().getClass().getResourceAsStream(
+ "/students.xsd")).build());
+ ValidationResult r = v.validateInstance(Input.fromStream(
+ new XMLUnitTest().getClass().getResourceAsStream(
+ "/students_with_error.xml")).build());
+ Iterator probs = r.getProblems().iterator();
+ int count = 0;
+ while (probs.hasNext()) {
+ count++;
+ probs.next().toString();
+ }
+ assertTrue(count > 0);
+ }
+
+ @Test
+ public void givenXml_whenValidatesAgainstXsd_thenCorrect() {
+ Validator v = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
+ v.setSchemaSource(Input.fromStream(
+ new XMLUnitTest().getClass().getResourceAsStream(
+ "/students.xsd")).build());
+ ValidationResult r = v.validateInstance(Input.fromStream(
+ new XMLUnitTest().getClass().getResourceAsStream(
+ "/students.xml")).build());
+ Iterator probs = r.getProblems().iterator();
+ while (probs.hasNext()) {
+ System.out.println(probs.next().toString());
+ }
+ assertTrue(r.isValid());
+ }
+
+ @Test
+ public void givenXPath_whenAbleToRetrieveNodes_thenCorrect() {
+ ClassLoader classLoader = getClass().getClassLoader();
+
+ Iterable i = new JAXPXPathEngine().selectNodes(
+ "//teacher",
+ Input.fromFile(
+ new File(classLoader.getResource("teachers.xml")
+ .getFile())).build());
+ assertNotNull(i);
+ int count = 0;
+ for (Iterator it = i.iterator(); it.hasNext();) {
+ count++;
+ Node node = it.next();
+ assertEquals("teacher", node.getNodeName());
+ NamedNodeMap map = node.getAttributes();
+ assertEquals("department", map.item(0).getNodeName());
+ assertEquals("id", map.item(1).getNodeName());
+ assertEquals("teacher", node.getNodeName());
+ }
+ assertEquals(2, count);
+ }
+
+ @Test
+ public void givenXmlSource_whenAbleToValidateExistingXPath_thenCorrect() {
+ ClassLoader classLoader = getClass().getClassLoader();
+ assertThat(Input.fromFile(new File(classLoader.getResource(
+ "teachers.xml").getFile())), hasXPath("//teachers"));
+ assertThat(Input.fromFile(new File(classLoader.getResource(
+ "teachers.xml").getFile())), hasXPath("//teacher"));
+ assertThat(Input.fromFile(new File(classLoader.getResource(
+ "teachers.xml").getFile())), hasXPath("//subject"));
+ assertThat(Input.fromFile(new File(classLoader.getResource(
+ "teachers.xml").getFile())), hasXPath("//@department"));
+ }
+
+ @Test
+ public void givenXmlSource_whenFailsToValidateInExistentXPath_thenCorrect() {
+ ClassLoader classLoader = getClass().getClassLoader();
+
+ assertThat(Input.fromFile(new File(classLoader.getResource(
+ "teachers.xml").getFile())), not(hasXPath("//sujet")));
+ }
+
+ @Test
+ public void given2XMLs_whenSimilarWithDiff_thenCorrect() throws Exception {
+ String myControlXML = "3false";
+ String myTestXML = "false3";
+
+ Diff myDiffSimilar = DiffBuilder
+ .compare(myControlXML)
+ .withTest(myTestXML)
+ .withNodeMatcher(
+ new DefaultNodeMatcher(ElementSelectors.byName))
+ .checkForSimilar().build();
+ assertFalse("XML similar " + myDiffSimilar.toString(),
+ myDiffSimilar.hasDifferences());
+
+ }
+
+ @Test
+ public void given2XMLsWithDifferences_whenTestsSimilarWithDifferenceEvaluator_thenCorrect() {
+ final String control = "";
+ final String test = "";
+ Diff myDiff = DiffBuilder
+ .compare(control)
+ .withTest(test)
+ .withDifferenceEvaluator(
+ new IgnoreAttributeDifferenceEvaluator("attr"))
+ .checkForSimilar().build();
+
+ assertFalse(myDiff.toString(), myDiff.hasDifferences());
+ }
+
+ @Test
+ public void given2XMLsWithDifferences_whenTestsDifferentWithoutDifferenceEvaluator_thenCorrect() {
+ final String control = "";
+ final String test = "";
+
+ Diff myDiff = DiffBuilder.compare(control).withTest(test)
+ .checkForSimilar().build();
+
+ assertTrue(myDiff.toString(), myDiff.hasDifferences());
+ }
+
+ @Test
+ public void given2XMLS_whenSimilarWithCustomElementSelector_thenCorrect() {
+ String controlXml = "3false";
+ String testXml = "false3";
+ assertThat(
+ testXml,
+ isSimilarTo(controlXml).withNodeMatcher(
+ new DefaultNodeMatcher(ElementSelectors.byName)));
+
+ }
+
+ @Test
+ public void givenFileSourceAsObject_whenAbleToInput_thenCorrect() {
+ ClassLoader classLoader = getClass().getClassLoader();
+ assertThat(Input.from(new File(classLoader.getResource("test.xml")
+ .getFile())), isSimilarTo(Input.from(new File(classLoader
+ .getResource("control.xml").getFile()))));
+
+ }
+
+ @Test
+ public void givenStreamAsSource_whenAbleToInput_thenCorrect() {
+ assertThat(Input.fromStream(new XMLUnitTest().getClass()
+ .getResourceAsStream("/test.xml")),
+ isSimilarTo(Input.fromStream(new XMLUnitTest().getClass()
+ .getResourceAsStream("/control.xml"))));
+
+ }
+
+ @Test
+ public void givenStreamAsObject_whenAbleToInput_thenCorrect() {
+ assertThat(Input.from(new XMLUnitTest().getClass().getResourceAsStream(
+ "/test.xml")), isSimilarTo(Input.from(new XMLUnitTest()
+ .getClass().getResourceAsStream("/control.xml"))));
+
+ }
+
+ @Test
+ public void givenStringSourceAsObject_whenAbleToInput_thenCorrect() {
+ assertThat(
+ Input.from("3false"),
+ isSimilarTo(Input
+ .from("3false")));
+
+ }
+
+ @Test
+ public void givenFileSource_whenAbleToInput_thenCorrect() {
+ ClassLoader classLoader = getClass().getClassLoader();
+ String testPath = classLoader.getResource("test.xml").getPath();
+ String controlPath = classLoader.getResource("control.xml").getPath();
+ assertThat(Input.fromFile(testPath),
+ isSimilarTo(Input.fromFile(controlPath)));
+
+ }
+
+ @Test
+ public void givenStringSource_whenAbleToInput_thenCorrect() {
+ String controlXml = "3false";
+ String testXml = "3false";
+ assertThat(Input.fromString(testXml),
+ isSimilarTo(Input.fromString(controlXml)));
+
+ }
+
+ @Test
+ public void givenSource_whenAbleToInput_thenCorrect() {
+ String controlXml = "3false";
+ String testXml = "3false";
+ assertThat(Input.fromString(testXml),
+ isSimilarTo(Input.fromString(controlXml)));
+
+ }
+
+ @Test
+ public void given2XMLS_whenIdentical_thenCorrect() {
+ String controlXml = "3false";
+ String testXml = "3false";
+ assertThat(testXml, isIdenticalTo(controlXml));
+
+ }
+
+ @Test
+ public void given2XMLSWithSimilarNodesButDifferentSequence_whenNotIdentical_thenCorrect() {
+ String controlXml = "3false";
+ String testXml = "false3";
+ assertThat(testXml, not(isIdenticalTo(controlXml)));
+
+ }
+
+ @Test
+ public void given2XMLS_whenGeneratesDifferences_thenCorrect()
+ throws Exception {
+ String controlXml = "3false";
+ String testXml = "false3";
+ Diff myDiff = DiffBuilder.compare(controlXml).withTest(testXml).build();
+ Iterator iter = myDiff.getDifferences().iterator();
+ int size = 0;
+ while (iter.hasNext()) {
+ iter.next().toString();
+ size++;
+ }
+ assertThat(size, greaterThan(1));
+ }
+
+ @Test
+ public void given2XMLS_whenGeneratesOneDifference_thenCorrect()
+ throws Exception {
+ String myControlXML = "3false";
+ String myTestXML = "false3";
+ Diff myDiff = DiffBuilder
+ .compare(myControlXML)
+ .withTest(myTestXML)
+ .withComparisonController(
+ ComparisonControllers.StopWhenDifferent).build();
+ Iterator iter = myDiff.getDifferences().iterator();
+ int size = 0;
+ while (iter.hasNext()) {
+ iter.next().toString();
+ size++;
+ }
+ assertThat(size, equalTo(1));
+ }
+
+}
diff --git a/xmlunit2-tutorial/src/test/resources/control.xml b/xmlunit2-tutorial/src/test/resources/control.xml
new file mode 100644
index 0000000000..afc0f53f91
--- /dev/null
+++ b/xmlunit2-tutorial/src/test/resources/control.xml
@@ -0,0 +1,4 @@
+
+ 3
+ false
+
\ No newline at end of file
diff --git a/xmlunit2-tutorial/src/test/resources/students.xml b/xmlunit2-tutorial/src/test/resources/students.xml
new file mode 100644
index 0000000000..413e73fd07
--- /dev/null
+++ b/xmlunit2-tutorial/src/test/resources/students.xml
@@ -0,0 +1,11 @@
+
+
+
+ Rajiv
+ 18
+
+
+ Candie
+ 19
+
+
\ No newline at end of file
diff --git a/xmlunit2-tutorial/src/test/resources/students.xsd b/xmlunit2-tutorial/src/test/resources/students.xsd
new file mode 100644
index 0000000000..15b10279f9
--- /dev/null
+++ b/xmlunit2-tutorial/src/test/resources/students.xsd
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/xmlunit2-tutorial/src/test/resources/students_with_error.xml b/xmlunit2-tutorial/src/test/resources/students_with_error.xml
new file mode 100644
index 0000000000..e9ce77faf0
--- /dev/null
+++ b/xmlunit2-tutorial/src/test/resources/students_with_error.xml
@@ -0,0 +1,12 @@
+
+
+
+ Rajiv
+ 18
+
+
+
+ Candie
+ 19
+
+
\ No newline at end of file
diff --git a/xmlunit2-tutorial/src/test/resources/teachers.xml b/xmlunit2-tutorial/src/test/resources/teachers.xml
new file mode 100644
index 0000000000..9c073d5a38
--- /dev/null
+++ b/xmlunit2-tutorial/src/test/resources/teachers.xml
@@ -0,0 +1,10 @@
+
+
+ math
+ physics
+
+
+ political education
+ english
+
+
\ No newline at end of file
diff --git a/xmlunit2-tutorial/src/test/resources/test.xml b/xmlunit2-tutorial/src/test/resources/test.xml
new file mode 100644
index 0000000000..afc0f53f91
--- /dev/null
+++ b/xmlunit2-tutorial/src/test/resources/test.xml
@@ -0,0 +1,4 @@
+
+ 3
+ false
+
\ No newline at end of file