2016-08-18 3 views
0

У меня довольно большое количество классов, которые являются Serializable/Externalizable и, к сожалению, часто случается так, что я забываю serailize/desirialize новое поле при добавлении его к классу или неправильному использованию readObject вместо readDouble. Поэтому я решил написать какой-то единичный тест, который игнорируется и не будет работать maven-surefire-plugin. Это только для моих собственных нужд. Это выглядит следующим образом:Как сравнить два объекта по их полям?

@Test(enabled = false) 
public void testEquality(Object o){ 
    String oPart = o.toString(); 
    try (FileOutputStream fos = new FileOutputStream("/home/myusr/testser/" + oPart); 
     ObjectOutputStream ous = new ObjectOutputStream(fos)) { 
     ous.writeObject(o); 
    } catch (FileNotFoundException | IOException e) { 
     e.printStackTrace(); 
    } 
    Object oo = null; 
    try (FileInputStream fis = new FileInputStream("/home/myusr/testser/" + oPart); 
     ObjectInputStream ois = new ObjectInputStream(fis)) { 
     Object oo = ois.readObject(); 
    } catch (FileNotFoundException | IOException | ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    // Need to compare all non-transient fields of o and oo 
} 

Но вопрос заключается в том, чтобы сравнить все поля, которые не являются transient с тем же именем. Я бы не хотел переопределять метод equals только для целей тестирования.

Есть ли способ справиться с этим? Возможно, есть библиотеки commons/guava, которые могут справиться с этим.

+0

Вы видели [shazamcrest] (https://github.com/shazam/shazamcrest)? –

ответ

2

Вы можете использовать отражение, чтобы сделать это, начиная с YourClaas.class.getDeclaredFields(). Затем вам нужно отфильтровать возвращаемые поля, получить значения из объектов и выполнить сравнение.

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