[英]Groovy : Compare SOAP Response with XML file
我想在groovy代碼中將我的Soap Response與xml文件忽略順序進行比較:
這是我的代碼:
import org.custommonkey.xmlunit.Stuff
import org.xmlunit.Stuff
//ExpectedString is my xml converted to text, same for ResponseString
Diff diff = DiffBuilder.compare(ExpectedString)
.withTest(ResponseString)
.ignoreComments()
.ignoreWhitespace()
.checkForSimilar()
.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))
.build();
assertFalse("XML similar " + diff.toString(), diff.hasDifferences())
因此,如您所見,我使用了DefaultNodeMatcher,我使用了XMLUnit2.0 ...,但沒有結果(即使比較時也沒有忽略順序或出現異常錯誤)
有解決方案嗎? 解決這個問題
由於我迫切希望找到一個直接的目錄,我可以對xml和soap響應進行排序,以便獲得一個簡單的diff嗎? 有沒有辦法按字母順序對它進行排序? 如果是,怎么辦?
感謝大伙們 !
更新:
這是我的XML結構簡化
<body>
<stuff>
<miniStuff></miniStuff>
<miniStuff></miniStuff>
</stuff>
<Services>
<Service>
<tag1>ValueA</tag1>
<tag2>ValueAA</tag2>
</Service>
<Service>
<tag1>ValueB</tag1>
<tag2>ValueBB</tag2>
</Service>
</services>
</body>
我的問題是我不能保證ValueA是第一個而不是第二個
這是您可能需要的一種:使用ByNameAndTextRecSelector
withNodeMatcher(new DefaultNodeMatcher(new ByNameAndTextRecSelector(),ElementSelectors.byName))
單元測試:
@Test
public void testDiffOrder() {
final String control = """
<r>
<ser>
<t1>a</t1>
<t2>b</t2>
</ser>
<ser>
<t1>d</t1>
<t2>e</t2>
</ser>
</r>"""
final String test = """
<r>
<ser>
<t1>d</t1>
<t2>e</t2>
</ser>
<ser>
<t1>a</t1>
<t2>b</t2>
</ser>
</r>"""
Diff diff = DiffBuilder.compare(Input.fromString(control))
.withTest(Input.fromString(test))
.ignoreComments()
.ignoreWhitespace()
.checkForSimilar()
.withNodeMatcher(new DefaultNodeMatcher(new ByNameAndTextRecSelector(),ElementSelectors.byName))
.build()
assertFalse("XML differ " + diff.toString(), diff.hasDifferences())
}
致謝@bodewig。 從這里取樣
更新:帶有OPs原始xml代碼段的更通用化版本 。
import org.xmlunit.builder.DiffBuilder
import org.xmlunit.builder.Input
import org.xmlunit.diff.ByNameAndTextRecSelector
import org.xmlunit.diff.DefaultNodeMatcher
import org.xmlunit.diff.ElementSelectors
def control = """<body>
<stuff>
<miniStuff />
<miniStuff />
</stuff>
<Services>
<Service>
<tag1>ValueB</tag1>
<tag2>ValueBB</tag2>
</Service>
<Service>
<tag1>ValueA</tag1>
<tag2>ValueAA</tag2>
</Service>
</Services>
</body>"""
def test = """<body>
<stuff>
<miniStuff />
<miniStuff />
</stuff>
<Services>
<Service>
<tag1>ValueA</tag1>
<tag2>ValueAA</tag2>
</Service>
<Service>
<tag1>ValueB</tag1>
<tag2>ValueBB</tag2>
</Service>
</Services>
</body>"""
def myDiff = DiffBuilder.compare(Input.fromString(control))
.withTest(Input.fromString(test))
.checkForSimilar()
.withNodeMatcher(new DefaultNodeMatcher(new ByNameAndTextRecSelector(),ElementSelectors.byName))
.build()
println myDiff.toString()
println myDiff.hasDifferences()
assert !myDiff.hasDifferences()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.