Visitar URL original
PlaceholderDifferenceEvaluator throws ClassCastException when using XMLSchema-instance (xsi) · Issue #276 · xmlunit/xmlunit · GitHub
Skip to content

PlaceholderDifferenceEvaluator throws ClassCastException when using XMLSchema-instance (xsi) #276

Closed

Description

@davidkron

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

Activity

  1. added this to the 2.10.1 milestone on Feb 4, 2025
  2. bodewig commented on Feb 4, 2025

    @bodewig
    Member

    Yes, PlaceHolderDifferenceEvaluator obviously only deals with "normal" attributes, where the comparison value is a string, not with the special case of xsi:type where DOMDifferenceEngine parses the value into a QName. XMLUnit.NET has the same issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions