Jak zapewnić równość na dwóch klasach bez metody równości?

Powiedz, że mam klasę bez metody equals (), do której nie ma źródła. Chcę potwierdzić równość w dwóch przypadkach tej klasy.

Mogę wykonać wiele stwierdzeń:

assertEquals(obj1.getFieldA(), obj2.getFieldA());
assertEquals(obj1.getFieldB(), obj2.getFieldB());
assertEquals(obj1.getFieldC(), obj2.getFieldC());
...

Nie podoba mi się to rozwiązanie, ponieważ nie uzyskuję pełnego obrazu równości, jeśli nie uda się to wcześniej.

Mogę samodzielnie porównać ręcznie i śledzić wynik:

String errorStr = "";
if(!obj1.getFieldA().equals(obj2.getFieldA())) {
    errorStr += "expected: " + obj1.getFieldA() + ", actual: " + obj2.getFieldA() + "\n";
}
if(!obj1.getFieldB().equals(obj2.getFieldB())) {
    errorStr += "expected: " + obj1.getFieldB() + ", actual: " + obj2.getFieldB() + "\n";
}
...
assertEquals("", errorStr);

Daje mi to pełny obraz równości, ale jest niezgrabny (i nawet nie uwzględniłem możliwych problemów zerowych). Trzecią opcją jest użycie Komparatora, ale compareTo () nie powie mi, które pola zawiodły.

Czy jest lepsza praktyka, aby uzyskać od obiektu to, czego chcę, bez podklasy i nadpisywania równego (ugh)?