2016-10-27 1 views
2

Je voulais sauter deux attributs de mon test d'acceptation.Alors j'ai ajouté la partie suivante pour supprimer ces deux attributs.Ceci m'a donné une erreur: junit.framework.AssertionFailedError: org.custommonkey.xmlunit.Diff [différent] Attendu nombre d'attributs d'éléments '2', mais était '1'Comment supprimer un attribut de test dans XMLUnit en Java?

partie du fichier XML:

<a:content schemaVS="1" 
a:schemaLocate="http://www.ContentXML.xsd" 
whiteSpaceMode="preserve"> 
<section type="Chapter" id="drd121"> 
    <p type="H1">This is H1.</p> 
</section> 

Une partie de la mise en œuvre Java:

public Document removeIgnoredCxmlNodes(Document resultDocument) { 

Element contentElement=(Element) resultDocument.getElementsByTagName("a:content").item(0); 
contentElement.removeAttribute("schemaVS"); 
contentElement.removeAttribute("a:schemaLocate"); 
return resultDocument; 

}

public void cxmlShouldBeProduced(String location) throws Throwable { 
try { 
    Document expectedDocument = parseDocument(RESOURCES_DIR_PATH.resolve(location)); 
    Document resultDocument = removeIgnoredCxmlNodes(parseDocument(resultCxmlPath)); 
    assertXMLEqual(expectedDocument, resultDocument); 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } 

}

+0

Pouvez-vous imprimer les deux documents à XML? Apparemment XMLUnit pense qu'ils sont différents. Cela peut être vrai, et si cela est acceptable, utilisez un 'DifferenceListener' comme indiqué ci-dessous par @jsheeran. –

Répondre

1

Ceci est le résultat de l'utilisation de l'implémentation par défaut de DifferenceListener. Pour spécifier qu'une comparaison doit ignorer un type particulier de différence, vous devez fournir votre propre implémentation.

L'exemple suivant est pour XMLUnit 1. Je n'ai pas encore utilisé 2, mais d'après ce que je comprends, la solution serait sensiblement la même.

public class DifferenceListenerImpl implements DifferenceListener { 
    @Override 
    public int differenceFound(Difference d) { 
    if (d.getId() == DifferenceConstants.ELEMENT_NUM_ATTRIBUTES_ID) { 
     return RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR; 
    } 
    // handle other difference types here 
    } 

    @Override 
    public void skippedComparison(Node control, Node test) { 
    // not needed 
    } 
} 
+0

est-ce une classe abstraite? – user2490093

+0

'DifferenceListener' est une interface dans XMLUnit 1; son équivalent en 2 est 'DifferenceEvaluator'. L'implémentation est une classe concrète. – jsheeran

+0

Quand je suis en train de créer la classe DifferenceListener il me donne une erreur .eclipse suggère de convertir en méthode abstraite ou ajouter la méthode suivante publique vide skippedComparison (Noeud arg0, Noeud arg1) {// \t \t TODO méthode généré automatiquement Stub \t \t \t} – user2490093

2

Pour xmlunit 2.x vous pas utiliser DifferenceEvaluator mais un "filtre attribut" comme dans

DiffBuilder b = DiffBuilder.compare(some-onput) 
    .withTest(some-test) 
    .withAttributeFilter(a -> { 
     QName attrName = Nodes.getQName(a); 
     return !a.equals(new QName("schemaVS")) 
      && !a.equals(new QName(schema-uri-of-a, "schemaLocate")); 
    }) 
    ... 
+0

J'ai configuré xmlunit-1.6.jar dans mon projet, mais DiffBuilder ne peut pas être résolu et j'ai utilisé ce corps dans la méthode 'removeIgnoredCxmlNodes' mentionnée dans la question.Am je corrige ici? – user2490093

+0

Il n'y a pas de 'DiffBuilder' dans XMLUnit 1.6, c'est pourquoi j'ai dit "en XMLUnit 2.x". Si vous êtes obligé de rester avec le vieux 1.6 alors quelque chose comme la réponse de @ jsheeran est ce que vous devez faire. –