2015-11-13 17 views
6

Con XMLUnit 2 come si confrontano due documenti senza tenere conto dell'ordine degli elementi?Confronta XML element element order

Ho ottenuto this question for XMLUnit 1, ma a quanto pare la nuova API in v2 non ha più il metodo menzionato.

Questo è il mio codice corrente:

Diff diff = DiffBuilder.compare(expected) 
      .withTest(actual) 
      .ignoreComments() 
      .ignoreWhitespace() 
      .checkForSimilar() 
      .build(); 

assertFalse(diff.hasDifferences()); 

Modifica per Stefan Bodewigs commento:

Queste sono le due stringhe mi confronto con sopra frammento:

String expected = "<root><foo>FOO</foo><bar>BAR</bar></root>"; 
String actual = "<root><bar>BAR</bar><foo>FOO</foo></root>"; 

I diff riportati

Expected element tag name 'foo' but was 'bar' - comparing <foo...> at /root[1]/foo[1] to <bar...> at /root[1]/bar[1] (DIFFERENT) 
Expected text value 'FOO' but was 'BAR' - comparing <foo ...>FOO</foo> at /root[1]/foo[1]/text()[1] to <bar ...>BAR</bar> at /root[1]/bar[1]/text()[1] (DIFFERENT) 
Expected element tag name 'bar' but was 'foo' - comparing <bar...> at /root[1]/bar[1] to <foo...> at /root[1]/foo[1] (DIFFERENT) 
Expected text value 'BAR' but was 'FOO' - comparing <bar ...>BAR</bar> at /root[1]/bar[1]/text()[1] to <foo ...>FOO</foo> at /root[1]/foo[1]/text()[1] (DIFFERENT) 
+0

La nuova API deve ignorare ordine elemento di default (questo è quello che 'DifferenceEvaluators.DEFAULT' fa). Sei sicuro che questa sia la differenza che vedi e non qualcos'altro? –

+0

Ho replicato il problema dell'OP, anche quando ho aggiunto .checkForSimilar(). Ciò sembra contrario alla documentazione all'indirizzo https://github.com/xmlunit/user-guide/wiki/DifferenceEvaluator#default-differenceevaluator L'aggiunta di .withNodeMatcher() descritta di seguito ha risolto il problema. –

risposta

8

Una differenza che potrebbe essere necessaria per diventare più chiara nella documentazione 2.x è l'impostazione predefinita ElementSelector - all'incirca quello che prima era ElementQualifier in 1.x. Nei casi in cui 1.x assume come valori predefiniti gli elementi per nome, i valori predefiniti di default 2.x corrispondono agli elementi in ordine. Forse questa è una cattiva idea.

Il tuo Diff dovrebbe funzionare se si passa alla corrispondenza sui nomi degli elementi.

.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))

+0

Grazie, Stefan! –