xmlunit
xmlunit copied to clipboard
PlaceholderDifferenceEvaluator throws ClassCastException when using XMLSchema-instance (xsi)
When using polymorphism in XML using XMLSchema-instance the PlaceholderDifferenceEvaluator
runs into an exception, when the xsi:type
attribute has a different value:
Exception:
java.lang.ClassCastException: class javax.xml.namespace.QName cannot be cast to class java.lang.String
JUnit test case that verifies the problem:
@Test
void placeholderDifferenceEvaluatorWithXmlInstance() {
var expectation = """
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myns:root xmlns:myns="http://example.com/myns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<myns:property xsi:type="myns:firstType">
value
</myns:property>
</myns:root>
""";
var xml = """
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myns:root xmlns:myns="http://example.com/myns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<myns:property xsi:type="myns:secondType">
value
</myns:property>
</myns:root>
""";
assertDoesNotThrow(() -> {
DiffBuilder
.compare(Input.fromString(expectation))
.withTest(Input.fromString(xml))
.ignoreWhitespace()
.withDifferenceEvaluator(new PlaceholderDifferenceEvaluator())
.build();
});
}
Stacktrace:
Caused by: java.lang.ClassCastException: class javax.xml.namespace.QName cannot be cast to class java.lang.String (javax.xml.namespace.QName is in module java.xml of loader 'bootstrap'; java.lang.String is in module java.base of loader 'bootstrap')
at org.xmlunit.placeholder.PlaceholderDifferenceEvaluator.evaluate(PlaceholderDifferenceEvaluator.java:210)
at org.xmlunit.diff.AbstractDifferenceEngine.compare(AbstractDifferenceEngine.java:187)
at org.xmlunit.diff.AbstractDifferenceEngine$ComparisonState$2.apply(AbstractDifferenceEngine.java:286)
at org.xmlunit.diff.AbstractDifferenceEngine$ComparisonState.andThen(AbstractDifferenceEngine.java:248)
at org.xmlunit.diff.AbstractDifferenceEngine$ComparisonState.andIfTrueThen(AbstractDifferenceEngine.java:259)
at org.xmlunit.diff.AbstractDifferenceEngine$ComparisonState.andIfTrueThen(AbstractDifferenceEngine.java:283)
at org.xmlunit.diff.DOMDifferenceEngine.compareXsiType(DOMDifferenceEngine.java:753)
at org.xmlunit.diff.DOMDifferenceEngine.access$800(DOMDifferenceEngine.java:47)
at org.xmlunit.diff.DOMDifferenceEngine$7.apply(DOMDifferenceEngine.java:411)
at org.xmlunit.diff.AbstractDifferenceEngine$ComparisonState.andThen(AbstractDifferenceEngine.java:248)
at org.xmlunit.diff.DOMDifferenceEngine.compareElementAttributes(DOMDifferenceEngine.java:408)
at org.xmlunit.diff.DOMDifferenceEngine.access$200(DOMDifferenceEngine.java:47)
at org.xmlunit.diff.DOMDifferenceEngine$6.apply(DOMDifferenceEngine.java:381)
at org.xmlunit.diff.AbstractDifferenceEngine$ComparisonState.andThen(AbstractDifferenceEngine.java:248)
at org.xmlunit.diff.DOMDifferenceEngine.compareElements(DOMDifferenceEngine.java:378)
at org.xmlunit.diff.DOMDifferenceEngine.nodeTypeSpecificComparison(DOMDifferenceEngine.java:216)
at org.xmlunit.diff.DOMDifferenceEngine.access$000(DOMDifferenceEngine.java:47)
at org.xmlunit.diff.DOMDifferenceEngine$2.apply(DOMDifferenceEngine.java:176)
at org.xmlunit.diff.AbstractDifferenceEngine$ComparisonState.andThen(AbstractDifferenceEngine.java:248)
at org.xmlunit.diff.DOMDifferenceEngine.compareNodes(DOMDifferenceEngine.java:173)
at org.xmlunit.diff.DOMDifferenceEngine$8.apply(DOMDifferenceEngine.java:619)
at org.xmlunit.diff.AbstractDifferenceEngine$ComparisonState.andThen(AbstractDifferenceEngine.java:248)
at org.xmlunit.diff.DOMDifferenceEngine.compareNodeLists(DOMDifferenceEngine.java:616)
at org.xmlunit.diff.DOMDifferenceEngine.access$100(DOMDifferenceEngine.java:47)
at org.xmlunit.diff.DOMDifferenceEngine$3.apply(DOMDifferenceEngine.java:260)
at org.xmlunit.diff.AbstractDifferenceEngine$ComparisonState.andThen(AbstractDifferenceEngine.java:248)
at org.xmlunit.diff.AbstractDifferenceEngine$ComparisonState.andIfTrueThen(AbstractDifferenceEngine.java:259)
at org.xmlunit.diff.DOMDifferenceEngine.compareNodes(DOMDifferenceEngine.java:181)
at org.xmlunit.diff.DOMDifferenceEngine$8.apply(DOMDifferenceEngine.java:619)
at org.xmlunit.diff.AbstractDifferenceEngine$ComparisonState.andThen(AbstractDifferenceEngine.java:248)
at org.xmlunit.diff.DOMDifferenceEngine.compareNodeLists(DOMDifferenceEngine.java:616)
at org.xmlunit.diff.DOMDifferenceEngine.access$100(DOMDifferenceEngine.java:47)
at org.xmlunit.diff.DOMDifferenceEngine$3.apply(DOMDifferenceEngine.java:260)
at org.xmlunit.diff.AbstractDifferenceEngine$ComparisonState.andThen(AbstractDifferenceEngine.java:248)
at org.xmlunit.diff.AbstractDifferenceEngine$ComparisonState.andIfTrueThen(AbstractDifferenceEngine.java:259)
at org.xmlunit.diff.DOMDifferenceEngine.compareNodes(DOMDifferenceEngine.java:181)
at org.xmlunit.diff.DOMDifferenceEngine.compare(DOMDifferenceEngine.java:117)
... 5 more