2015-02-26 4 views
1

У меня есть проблема в сравнении строк xml.Игнорировать различия в текстах при сравнении XML с xmlunit

Моя функция сравнения

public static boolean compareXMLs(String xmlSource, String xmlCompareWith){ 

XMLUnit.setIgnoreWhitespace(true); 
XMLUnit.setIgnoreComments(true); 
XMLUnit.setIgnoreAttributeOrder(true); 

XMLUnit.setNormalizeWhitespace(true); 
XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true); 

Diff myDiff = new Diff(xmlSource, xmlCompareWith); 
myDiff.overrideDifferenceListener(new IgnoreTextAndAttributeValuesDifferenceListener()); 
return myDiff.similar(); 
} 

Мой блок тест

String xml1 = "<a>f</a>"; 
String xml2 = "<a>1</a>"; 
assertEquals(true, RestCommonUtility.compareXMLs(xml1, xml2)); 

xml1 = "<a></a>"; 
xml2 = "<a>1</a>"; 
assertEquals(true, RestCommonUtility.compareXMLs(xml1, xml2)); 

Мой блок тест пройден в первой утверждают, но терпит неудачу в 2 утверждают. Я установил IgnoreTextAndAttributeValuesDifferenceListener, но все же мое второе утверждение терпит неудачу. Есть ли способ решить эту проблему? Или есть ли какие-либо другие рамки для такого сравнения?

+0

попробуйте toString на diff - от того, что я помню, игнорирует, просто не сравнивает текст, но подтверждает его там – farrellmr

+0

Ya, когда я использую новый xmlunit, это говорит о CHILD_NODELIST_LENGTH. Это другое. Но я тоже не хочу этого игнорировать. –

+0

Примечание: используйте 'assertTrue (foo)', а не 'assertEquals (true, foo)'. –

ответ

1

Вы можете создать свой собственный DifferenceListener, который игнорирует разницу, когда один узел имеет один текстовый дочерний узел, а другой нет. Вот пример:

public class CompareStructureOnlyListener implements DifferenceListener { 

    private IgnoreTextAndAttributeValuesDifferenceListener delegate = 
     new IgnoreTextAndAttributeValuesDifferenceListener(); 

    @Override 
    public int differenceFound(Difference difference) { 
    int delegateResult = delegate.differenceFound(difference); 

    if (delegateResult == DifferenceListener.RETURN_ACCEPT_DIFFERENCE) { 
     // Delegate thinks there is a difference, let's confirm 

     if (difference.getId() == DifferenceConstants.HAS_CHILD_NODES_ID) { 
     Node controlNode = difference.getControlNodeDetail().getNode(); 
     Node testNode = difference.getTestNodeDetail().getNode(); 

     Node nodeToTest = (controlNode.hasChildNodes()) ? controlNode : testNode; 

     // If there is only a difference of one node and that node is a text 
     // node, then ignore it 
     if (nodeToTest.getChildNodes().getLength() == 1 
      && nodeToTest.getFirstChild() instanceof Text) { 
      return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_SIMILAR; 
     } else { 
      return DifferenceListener.RETURN_ACCEPT_DIFFERENCE; 
     } 
     } 
    } 
    return delegateResult; 
    } 

    @Override 
    public void skippedComparison(Node control, Node test) { 
    // Does nothing 
    } 
} 

А вот некоторые тесты, которые проходят:

String xml1 = "<a>a</a>"; 
String xml2 = "<a>1</a>"; 
assertTrue(compareXMLs(xml1, xml2)); 

xml1 = "<a></a>"; 
xml2 = "<a>1</a>"; 
assertTrue(compareXMLs(xml1, xml2)); 

xml1 = "<a></a>"; 
xml2 = "<a><f></f></a>"; 
assertFalse(compareXMLs(xml1, xml2)); 

примечание стороны: переименовать метод compareXMLs к чему-то вроде xmlsAreSimilar, или что-то, что легко указывает то, что логические средства возвращаемого значения ,

+0

Я пробовал то же самое, он работает. Но ниже тест терпит неудачу. 'xml1 =" f "; xml2 = "ee"; assertTrue (compareXMLs (xml1, xml2)); ' –

+0

@Pasupathi Разве это не то, что вы хотите? Я думал, что единственная разница, которую вы хотели игнорировать, заключалась в том, что один элемент имел текст, а другой - нет? –

+0

На самом деле я хотел именно ваше имя класса CompareStructureOnlyListener :) независимо от того, что дополнительные узлы или некоторые из узлов недоступны. –

0

Если сообщается об ошибке CHILD_NODELIST_LENGTH, тогда создайте пользовательский IgnoreTextAndAttributeValuesDifferenceListener, который также игнорирует CHILD_NODELIST_LENGTH. Id запускает его через отладчик, чтобы подтвердить разницу, а затем исключить его.

Смежные вопросы