[JAVA] JUnit-Zusicherungen und Matcher-API

Überblick

In JUnit ist es ein Element, das für die Wertüberprüfung verantwortlich ist. Verstehen Sie "Assertion" und "Matcher API".

Was ist eine Behauptung?

Behauptung hat die Bedeutung von Bestätigung und Bestätigung in einer wörtlichen Übersetzung.

JUnit kann grob geteilt werden

  1. Definition der Voraussetzungen und erwarteten Ergebnisse
  2. Ausführung des Testziels
  3. Vergleichsüberprüfung des erwarteten Ergebnisses und des Ausführungsergebnisses

Ein Komponententest wird in den obigen drei Schritten durchgeführt. Was ist eine Behauptung in JUnit? Dies ist der dritte Mechanismus zur Durchführung einer "Vergleichsüberprüfung zwischen angenommenen Ergebnissen und Ausführungsergebnissen".

Verwenden Sie es im eigentlichen Code wie folgt.

Beispiel für eine Behauptung.java


int expected = 1;
int actual = calc();
assertThat(actual, is(expected));

Wenn Sie so schreiben, wird der Test Stellen Sie sicher, dass der tatsächliche Wert erwartet wird. (Bestätigen Sie, dass der gemessene Wert ein erwarteter Wert ist.) Kann in natürlicher Sprache (gesprochenes Englisch) geschrieben werden.

Was ist die Matcher-API?

Die Methode `ist (erwartet)`, die in dem zuvor erwähnten Quellcode vorkommt, ist Es ist eine statische Methode, die in der CoreMatcher-Klasse der Matcher-API implementiert ist. Die Matcher-API ist für Zusicherungen vorgesehen, die eine ** Wertvergleichsmethode ** bereitstellen. Es ist ein Mechanismus, um ** Wertüberprüfungsmethode ** bereitzustellen, Bisher wurde es nur in der JUnit-Erweiterungsbibliothek namens Hamcrest implementiert. Es ist jetzt auch in JUnit selbst enthalten.

Matcher von Core Matchers

ist "tatsächlich wird erwartet."

Stellen Sie sicher, dass die Werte gleich sind.

assertThat(actual, is(expected));

nicht "tatsächlich wird nicht erwartet."

Invertieren Sie das von Matcher zurückgegebene Überprüfungsergebnis. Es kann auch auf andere Matcher als bisher angewendet werden.

assertThat(actual, is(not(expected)));

nullValue "Ist ist null."

Da die is-Methode einen Typparameter hat, können Sie keinen Nullwert übergeben. Wenn Sie eine Nullüberprüfung durchführen möchten, verwenden Sie daher die nullValue-Methode.

assertThat(actual, is(nullValue()));
/* 
Der folgende Schreibstil ist ebenfalls möglich:
Es ist üblich, das Obige zu schreiben, um eher wie eine natürliche Sprache zu schreiben.
*/
assertThat(actual, nullValue());

notNullValue "Ist ist nicht null."

Stellen Sie sicher, dass der Wert nicht null ist.

assertThat(actual, is(notNullValue()));
//Synonym zu
assertThat(actual, is(not(nullValue()));

sameInstance "Ist und erwartet sind dieselbe Instanz."

Stellen Sie sicher, dass die Werte gleich sind. Während die is-Methode mit "gleich" verglichen wird, führt sameInstance einen Vergleich mit "= relativ" durch.

assertThat(actual, is(sameInstance(expected)));

instanceOf "actual ist ein Wert, der mit erwartet kompatibel ist."

Stellen Sie sicher, dass der Wert den erwarteten Wert erbt.

assertThat(actual, is(instanceOf(Serializable.class)));

Matcher von JUnit Matchers

hasItem "Ist enthält erwartet."

Für Messwerte, die wie eine Sammlungsklasse wiederholt werden können (einen Iterator haben) Stellen Sie sicher, dass der erwartete Wert enthalten ist.

List<String> actual = getList();
assertThat(actual, hasItem(expected));

hasItems "Ist enthält erwartet."

Der zu überprüfende Inhalt ist der gleiche wie hasItem, außer dass für den angenommenen Wert ein Argument variabler Länge verwendet wird. Ein nützlicher Matcher, um zu überprüfen, ob alle erwarteten Werte enthalten sind, unabhängig von der Reihenfolge.

List<String> actual = getList();
assertThat(actual, hasItem(expected1, expected2));

Ergänzung: Matcher zur Verfügung gestellt von hamcrest-library

Eine weitere Erweiterungsbibliothek namens hamcrest-library Es bietet einen Matcher, der zur allgemeinen Überprüfung von Sammlungen, Nummern, Texten usw. verwendet werden kann. Es gibt verschiedene andere Erweiterungsbibliotheken. Bevor Sie den unten vorgestellten benutzerdefinierten Matcher einführen, Es ist eine gute Idee, nach einem Matcher zu suchen, der bereits verfügbar ist.

Benutzerdefinierter Matcher

Matcher kann einen benutzerdefinierten Matcher erstellen, der seine eigene Validierung durchführt. Hier implementieren wir Matcher, der die folgenden Anforderungen erfüllt.

・ Beim Vergleichen und Überprüfen der Datumsklasse werden Jahr, Monat und Tag verglichen.

Das Folgende ist die Implementierung von Matcher, die die oben genannten Anforderungen und deren Anrufverarbeitung erfüllt.

DateTest.java


import static jp.sample.matcher.IsDate.*;
~Kürzung~
        assertThat(new Date(), is(dateOf(2020, 4, 12)));

IsDate.java


// 1.Erklärung der Matcher-Klasse
public class IsDate extends BaseMatcher<Date> {

    // 3.Implementierung eines Mechanismus zum Halten angenommener Werte
    private final int yyyy;
    private final int mm;
    private final int dd;
    Object actual;

    // 3.Implementierung eines Mechanismus zum Halten angenommener Werte
    IsDate(int yyyy, int mm, int dd) {
        this.yyyy = yyyy;
        this.mm = mm;
        this.dd = dd;
    }

    // 4.Implementierung des Verifizierungsprozesses
    @Override
    public boolean matches(Object actual) {
        this.actual = actual;
        if (!(actual instanceof Date)) {
            return false;
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime((Date) actual);
        if (yyyy != cal.get(Calendar.YEAR)) {
            return false;
        }
        if (mm != cal.get(Calendar.MONTH)) {
            return false;
        }
        if (dd != cal.get(Calendar.DATE)) {
            return false;
        }
        return true;
    }

    // 5.Implementierung einer Fehlermeldung
    @Override
    public void describeTo(Description desc) {
        desc.appendValue(String.format("%d/%02d/%02d", yyyy, mm, dd));
        if (actual != null) {
            desc.appendText(" but actual is ");
            desc.appendValue(
                new SimpleDateFormat("yyyy/MM/dd").format((Date) actual));
        }
    }

    // 2.Implementierung der Validierungsmethode
    public static Matcher<Date> dateOf(int yyyy, int mm, int dd) {
        return new IsDate(yyyy, mm, dd);
    }
}

1. Erklärung der Matcher-Klasse

Die org.hamcrest.Matcher-Schnittstelle als Implementierungsklasse für benutzerdefinierten Matcher Implementieren, aber die direkte Implementierung der Matcher-Schnittstelle ist veraltet. Also implementieren wir die Matcher-Schnittstelle Implementierung durch Erben von org.hamcrest.BaseMatcher.

BaseMatcher hat den gemessenen Wert als Typparameter.

/* 
public class [Beliebiger Klassenname] extends BaseMatcher<[Messwerttyp]> {
}
*/
public class IsDate extends BaseMatcher<Date> {
}

2. Implementierung der Validierungsmethode

Implementieren Sie die an das zweite Argument der assertThat-Methode übergebene Methode. Da der angenommene Wert an das zweite Argument übergeben wird, definieren Sie den Konstruktor der Matcher-Klasse. Initialisieren Sie die Matcher-Klasse mit den erwarteten Werten. Informationen zum Mechanismus zum Halten des angenommenen Werts finden Sie unter "3. Implementierung des Mechanismus zum Halten des angenommenen Werts".

/*
    public static Matcher<[Messwerttyp]> [Beliebiger Methodenname]([FürdieInitialisierungerforderlicherWert]) {
        return [Matcher-Klassenkonstruktor];
    }
*/
    public static Matcher<Date> dateOf(int yyyy, int mm, int dd) {
        return new IsDate(yyyy, mm, dd);
    }

3. Implementierung eines Mechanismus zum Halten angenommener Werte

Tatsächliche Messwerte und angenommene Werte sind erforderlich, um die Werte zu überprüfen. Daher implementiert die Matcher-Klasse einen Mechanismus, um sie als Mitglieder zu halten.

    //Mitglied mit dem erwarteten Wert
    private final int yyyy;
    private final int mm;
    private final int dd;
    //Mitglied, das den gemessenen Wert hält
    Object actual;

    //Konstruktor zum Festlegen des erwarteten Werts
    IsDate(int yyyy, int mm, int dd) {
        this.yyyy = yyyy;
        this.mm = mm;
        this.dd = dd;
    }

4. Implementierung des Verifizierungsprozesses

Wenn die assertThat-Methode ausgeführt wird, wird sie verarbeitet Die in der Matcher-Schnittstelle definierte Übereinstimmungsmethode wird aufgerufen. Wenn der Rückgabewert in der Übereinstimmungsmethode falsch ist, wird der Test als nicht erfolgreich beurteilt, und wenn er wahr ist, wird der Test als erfolgreich beurteilt. Da der gemessene Wert als Argument genommen wird, wird er mit dem angenommenen Wert überprüft, der von der Matcher-Klasse gehalten wird. Implementieren Sie dies so, dass true zurückgegeben wird, wenn das Überprüfungsergebnis wie erwartet ist, und false, wenn es anders ist.

    @Override
    public boolean matches(Object actual) {
        //Halten Sie den übergebenen Messwert als Mitglied der Matcher-Klasse
        this.actual = actual;
        //Typprüfung(Schreiben Sie versprochen)
        if (!(actual instanceof Date)) {
            return false;
        }
        //Das Folgende ist eine ursprüngliche Implementierung, implementieren Sie sie also entsprechend dem Zweck
        Calendar cal = Calendar.getInstance();
        cal.setTime((Date) actual);
        if (yyyy != cal.get(Calendar.YEAR)) {
            return false;
        }
        if (mm != cal.get(Calendar.MONTH)) {
            return false;
        }
        if (dd != cal.get(Calendar.DATE)) {
            return false;
        }
        return true;
    }

5. Implementierung der Fehlermeldung

Wie die Matches-Methode die in der Matcher-Schnittstelle definierte Methode. Es wird nur aufgerufen, wenn das Testergebnis nicht erfolgreich ist und die Fehlermeldung hier definiert ist.

    @Override
    public void describeTo(Description desc) {
        //Erwartete Wertausgabe
        desc.appendValue(String.format("%d/%02d/%02d", yyyy, mm, dd));
        //Ausgabe des Messwertes
        if (actual != null) {
            desc.appendText(" but actual is ");
            desc.appendValue(
                new SimpleDateFormat("yyyy/MM/dd").format((Date) actual));
        }
    }

Ausgabeergebnis an die Konsole


java.lang.AssertionError:
Expected: is "2011/02/10" but actual is "2012/03/08"
     got: <Thu Mar 08 23:02:49 JST 2012>

Vorlage für Fehlermeldung
[Name der Fehlerklasse]
Expected: is [Nachricht, die durch die Methode verifyTo definiert wurde]
     got: [Messwert zum Ergebnis der String-Ausgabe]

appendValue-Methode

//Wenn eine Zeichenfolge als Argument übergeben wird
"2012/03/08" (Wert umgeben von Doppelbeschichtung)
//Wenn ein Objekt als Argument übergeben wird
<Thu Mar 08 23:02:49 JST 2012> (ToString-Ausgabeergebnis des übergebenen Objekts)

appendText-Methode

 but actual is  (Nicht von Doppelbeschichtung umgeben)

Verweise

Dieser Artikel wurde unter Bezugnahme auf die folgenden Informationen verfasst.

Recommended Posts

JUnit-Zusicherungen und Matcher-API
Testen Sie die Web-API mit junit