2015-10-19 44 views
1

我目前使用TestNg編寫測試用例。我使用PodamFactory填充對象。我有以下測試用例結構。是Java jackson ObjectWriter.ObjectWriter.writeValueAsString(obj);穩定?

@Test 
public void testIt(){ 
ARespObject resp = PodamFactory.manufacturePojo(ARespObject.class); 
String responseXml = new JaxbStringTransformer().transform(resp); 

// a new object with all the same data 
ARespObject respActual = responder.getObj(responseXml); 

Assert.assertTrue(TestUtils.areEqual(respActual , resp)); 
} 

public static <T extends Object> boolean areEqual(T sourceObj, T target) { 
    if (sourceObj == null && target == null) { 
     return true; 
    } 
    if (sourceObj == target) { 
     return true; 
    } 
    if (sourceObj.getClass() != target.getClass()) { 
     return false; 
    } 
    if (sourceObj != null && target != null) { 
     return stringifyObject(sourceObj).equals(stringifyObject(target)); 
    } 

    return false; 
} 

public static String stringifyObject(Object obj) { 
    String result = ""; 
    ObjectWriter ow = new JaxbJacksonObjectMapper().writer().withDefaultPrettyPrinter(); 
    try { 
     result = ow.writeValueAsString(obj); 
    } catch (JsonGenerationException e1) { 
     LOG.error(e1); 
    } catch (JsonMappingException e1) { 
     LOG.error("JsonMappingException: " + e1); 
    } catch (IOException e1) { 
     LOG.error("IOException: " + e1); 
    } 
    return result; 
} 

我需要知道,如果writeValueAsString(OBJ)總是兩個對象提供相同的結構(即,它的輸出將保持穩定)出發,按照

stringifyObject(sourceObj).equals(stringifyObject(target)); 

是一個有效的檢查。我擔心它是否會給我ARespObject內部不同的變量排序。

+0

我會關心數組/列表中的元素順序。 –

回答

0

我建議不要使用對象的字符串表示來測試相等性。您應該使用您想要測試的對象的.equals方法。

+0

我無法更新ARespObject,並且有可能需要在這些測試用例中檢查的100個類 – zur

2

與其將對象格式化爲字符串進行比較,不如將它們轉換爲「樹模型」(JsonNode實現)。 ObjectNode實現equals/hashCode/toString等來合理模仿JSON等價,所以它將忽略屬性的順序,例如。

ObjectMapper mapper = new ObjectMapper(); 
JsonNode treeNode = mapper.convertValue(obj, JsonNode.class); 

(通常你會得到一條ObjectNode回來,但你可以很可能只使用JsonNode接口)

樹模型類也將執行一個簡單的JSON格式設置的toString()輸出,所以「預期」和「實際」打印輸出應該是可讀的(儘管不如漂亮的打印機漂亮)