2013-01-04 85 views
4

我使用Hamcrest Matcher来比较两个JSON对象。比较方法使用Gson解析器。Hamcrest Matcher with junit style diff

的匹配的伟大工程,但是当两个JSON是不一样的,我只能显示像消息:

Expected: <[{"data":"data1","application":{"id":"1"}}]> 
    but: <[{"data":"data1","application":{"id":"2"}}]> 

这是不是非常有帮助,我想展现的元素不匹配,像什么junit的assertEquals:

expected:<...a1","application":{"[filtered":false,"id":"1"]...> but was:<...a1","application":{"[id":"2"...> 

有没有办法实现这一目标?

编辑:

@Override 
protected void describeMismatchSafely(JsonElement item, 
             Description mismatchDescription) { 
    //mismatchDescription.appendValue(item); 
    assertEquals(item.toString(), originalJson.toString()); 
} 

但是,这会给我:

expected:<...a1","application":{"[filtered":false,"id":"2"]...> 
but was:<...a1","application":{"[id":"1","filtered":false],...> 

注意,唯一不同的是 “ID:1” 和 “ID:2”,但JUnit的表明了我JSON中的不同排序也是错误的一部分。

回答

2

我能做迄今为止最好的:

@Override 
protected void describeMismatchSafely(JsonElement expectedJson, 
             Description mismatchDescription) { 

    mismatchDescription.appendValue(expectedJson).appendText("\ndifference:\n"); 

    try { 
    assertEquals(expectedJson.toString(), originalJson.toString()); 
    } 
    catch (ComparisonFailure e) { 
    String message = e.getMessage(); 
    message = message.replace("expected:", ""); 
    message = message.replace("but was:", ""); 
    message = message.replaceFirst(">", ">\n"); 
    mismatchDescription.appendText(message); 
    } 
} 

这给了我

Expected: <[{"data":"data1","application":{"id":"1"}}]> 
    but: <[{"data":"data1","application":{"id":"2"}}]> 
difference: 
<...a1","application":{"[filtered":false,"id":"2"],...> 
<...a1","application":{"[id":"1","filtered":false],...>