xmlunit icon indicating copy to clipboard operation
xmlunit copied to clipboard

PlaceholderDifferenceEvaluator throws ClassCastException when using XMLSchema-instance (xsi)

Open davidkron opened this issue 5 months ago • 0 comments

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

davidkron avatar Sep 23 '24 11:09 davidkron