[JAVA] Mit EqualsVerifier wurde der equals () -Test sofort abgeschlossen

Einführung

Wenn Sie die Klassenäquivalenz in Java überprüfen möchten, müssen Sie equals () undhashCode ()ordnungsgemäß implementieren [^ 1]. Normalerweise implementiere ich es nicht selbst, daher denke ich, dass es keinen Fehler gibt, aber ich mache mir Sorgen, es nicht zu testen.

Als ich nach einer effizienten Methode suchte, fand ich eine Bibliothek namens EqualsVerifier [].

Installation

Erste Schritte beschreibt die Einrichtung in Maven. Weitere Tools finden Sie unter Mvn Repository.

Wie benutzt man

Beispielsweise gibt es die folgende Namensklasse. Die equals () undhashCode ()werden automatisch von IntelliJ IDEA generiert.

import java.util.Objects;

public final class Name {
    private final String name;

    public Name of(String name) {
        return new Name(name);
    }

    public Name(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Name name1 = (Name) o;
        return Objects.equals(name, name1.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

Der Test hierfür ist wie folgt (mit JUnit 4.12.).

import nl.jqno.equalsverifier.EqualsVerifier;
import org.junit.Test;

import java.sql.Timestamp;

public final class EqualsVerifierTest {
    @Test
    public void test_name() {
        EqualsVerifier.forClass(Name.class).verify();
    }
}

Nur das. Es ist einfach.

Natürlich weiß ich nicht, ob ich es wirklich getestet habe, also teste ich es zum Beispiel mit der Klasse Timestamp [], die nicht dem allgemeinen Vertrag von equals () folgt.

EqualsVerifier.forClass(Timestamp.class).verify();

Ich habe den folgenden Fehler erhalten.

java.lang.AssertionError: Overloaded: More than one equals method found. Signature should be: public boolean equals(Object obj) For more information, go to: http://www.jqno.nl/equalsverifier/errormessages

Wenn Sie bestimmte Felder ausschließen möchten

Es befindet sich unter Felder ignorieren, kann jedoch beispielsweise ausgeschlossen werden: Einzelheiten finden Sie in der Dokumentation.

Ich denke, es ist besser, Transient für mich selbst zu verwenden.

Funktionsprinzip

Es steht am Ende von Warum, was, wie?, aber es ist ungefähr wie folgt. Es ist ein bisschen schwarze Magie.

  1. Erstellen Sie wie beim Mocking-Framework eine Instanz, ohne einen Konstruktor aufzurufen.
  2. Verwenden Sie Reflection, um den Wert im Feld festzulegen.
  3. Überprüfen Sie, ob equals () undhashCode ()die erwarteten Ergebnisse für diese liefern.
  4. Untersuchen Sie die Signatur der Methode equals (), um sicherzustellen, dass Sie Überschreibungen anstelle von Überladungen verwenden.

abschließend

Ich fand es wichtig, eine gute Zeit zu haben (´ω`)

[^ 1]: Effektive Java 2nd Edition Siehe "Punkt 8 Befolgen Sie den allgemeinen Vertrag, wenn Sie Gleichheit überschreiben" und "Punkt 9 überschreiben Sie immer den Hashcode, wenn Sie Gleichheit überschreiben".

Recommended Posts

Mit EqualsVerifier wurde der equals () -Test sofort abgeschlossen
Ich war süchtig nach dem Spring-Batch-Test
Testen Sie den Inhalt einer Excel-Datei mit JUnit
Integrationstest mit Gradle
[Schienen] Test mit RSpec
Testen Sie Nokogiri mit Rspec.
Automatisch mit Messgerät testen
Lasttest mit JMeter
Machen Sie einen Unit-Test mit Junit.
Was ich mit der Redmine REST API süchtig gemacht habe