2015-10-19 8 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 (объект) всегда будет обеспечивать такую ​​же структуру для обоих объектов (то есть. Его выход будет стабильным) и после

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() выход, так «ожидаемые» и «фактические» распечатки должны быть удобочитаемыми (хотя и не такими красивыми, как у симпатичного принтера)