Hier meine Anforderungen für Unit-Tests sind:Test Unit - Umsetzung equals nur Tests zu erleichtern
- Ich mag würde meine Produktion Klassen Einheit testen
- Ich mag würde Testcode und Produktionscode trennen auseinander solche dass ich nur Produktionscode freigeben kann
Dies scheint wie angemessene Anforderungen. Ein Problem tritt jedoch immer dann auf, wenn ich Methoden wie assertEquals
für Objekte verwenden muss, da diese die Methode equals
außer Kraft setzen müssen. Die Methode equals
müsste in den Produktionsklassen implementiert werden, wird aber nur zum Testen verwendet. Dies wird noch schlimmer, wenn eine gute Kodierungspraxis vorschreibt, dass, wenn equals
überschrieben wird, auch hashCode
implementiert werden sollte, was zu noch mehr unbenutztem Produktionscode führt, der die Produktionsklassen überlagert.
Hier ist ein einfaches Beispiel mit einem User
Modell (IntelliJ autoimplemented equals
und hashCode
)
public class User
{
public long id;
public long companyId;
public String name;
public String email;
public long version;
@Override
public boolean equals(Object o)
{
if(this == o) return true;
if(o == null || getClass() != o.getClass()) return false;
User user = (User) o;
if(companyId != user.companyId) return false;
if(id != user.id) return false;
if(version != user.version) return false;
if(!email.equals(user.email)) return false;
if(!name.equals(user.name)) return false;
return true;
}
@Override
public int hashCode()
{
int result = (int) (id^(id >>> 32));
result = 31 * result + (int) (companyId^(companyId >>> 32));
result = 31 * result + name.hashCode();
result = 31 * result + email.hashCode();
result = 31 * result + (int) (version^(version >>> 32));
return result;
}
}
Wie es zu sehen ist, equals
und hashCode
nimmt die Klasse viel Platz und clutters.
Eine Lösung für das Problem könnte sein, eine Klasse UserTester
zu erstellen, die eine assertUserEquals
-Methode haben könnte, die anstelle von zB verwendet werden könnte. JUnits assertEquals
.
Eine andere Lösung könnte sein, eine UserComparator
zu erstellen. Es scheint jedoch nicht so, als hätte JUnit eine assertEquals
, die eine Comparator
dauert.
Was sind die besten Praktiken in diesem Punkt?
Nur ihre Dokumentation überprüft. Es scheint, dass Sie 'assertReflectionEquals' anstelle von' assertEquals' verwenden sollten. Es scheint, dass dies die Lösung für mein Problem ist. – foens
Mein böser, danke fürs merken – Jk1
Ehh - Habe gerade ein kleines Problem gefunden, das ich in meiner Frage nicht vorgestellt habe. Was ist mit der Verwendung von Frameworks wie [Mockito] (https://code.google.com/p/mockito/) zum Spotten? Wenn Sie Methoden wie 'verify (userDeleter) .delete (user)' verwenden, verwendet es auch 'equals' zum Testen der Argumente. Kennen Sie eine Lösung für dieses Problem? – foens