[JAVA] Schreiben Sie Hamcrest Matcher im Lambda-Stil

Wenn Sie Java-Tests mit JUnit + Hamcrest implementieren, möchten Sie möglicherweise das zweite Argument der assertThat-Methode in einem Lambda-Ausdruck implementieren. Da der Typ des zweiten Arguments von assertThat jedoch org.hamcrest.Matcher ist, entspricht es nicht den Java 8-Lambda-Ausdrücken. (Weil Hamcrest 2.1 mit Java 7 erstellt wurde)

Ich dachte darüber nach, wie man eine Wertvalidierung mit einem Lambda-Ausdruck implementiert.

Implementierungsimage testen

Das folgende Programm ist ein Test, um zu überprüfen, ob die zu überprüfende Methode 0 oder weniger ist. Matcher, wenn er kleiner als der angegebene Wert ist, wird von hamcrest bereitgestellt, aber hier ist es nur ein Beispiel ...

@Test
public void testSum() {
 // Teste, ob der Wert kleiner oder gleich 0 ist
    assertThat(new App().sum(10, -20), is(matches(i -> i <= 0, "negative value")));
}

Effektive Nutzung

--Wenn es mehrere Vergleichsbedingungen gibt. Überprüfen Sie beispielsweise, ob es mit 1,2,3,4 usw. übereinstimmt.

Realisierungsmethode

Implementieren Sie einen benutzerdefinierten Matcher wie den folgenden. Sie können Code wie den oben beschriebenen implementieren, indem Sie diesen benutzerdefinierten Matcher statisch importieren.

import java.util.function.Predicate;

import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;

public class LambdaMatcher<T> extends TypeSafeMatcher<T> {

	private Predicate<T> predicate;
	private String message;

	public LambdaMatcher(Predicate<T> predicate, String message) {
		this.predicate = predicate;
		this.message = message;
	}

	@Override
	public void describeTo(Description description) {
		description.appendText(this.message);
	}

	@Override
	protected boolean matchesSafely(T item) {
		return this.predicate.test(item);
	}

	public static <T> Matcher<T> matches(Predicate<T> predicate, String message) {
		return new LambdaMatcher<>(predicate, message);
	}
}

Obwohl die Methode die Nachricht vom Aufrufer als String-Typ empfangen soll, kann sie auch wie die Assertions-Klasse von JUnit5 unter Verwendung des Supplier \ <String > -Typs verwendet werden.

Ich hoffe, es ist hilfreich, wenn Sie Lambda-Ausdrücke in Hamcrest testen möchten.

Bemerkungen

--2018 / 12/31 Da im Kommentar darauf hingewiesen wurde, wurde der Code der Implementierungsmethode korrigiert. Vielen Dank.

Recommended Posts

Schreiben Sie Hamcrest Matcher im Lambda-Stil
Ich möchte in der Lage sein, selbst reguläre Ausdrücke zu denken und zu schreiben. ..
[Java] Einführung in den Lambda-Ausdruck
[Einführung in Java] Über Lambda-Ausdrücke
Dinge, die in bedingten Ausdrücken zu beachten sind
Verwendung von Java-Lambda-Ausdrücken
Ich habe versucht, Java-Lambda-Ausdrücke zusammenzufassen
Antwortdaten direkt im Frühjahr schreiben
[Ruby] Grundlegender Schlüssel, um beim Refactoring stark zu sein
[Rails] Verschiedene Möglichkeiten zum Schreiben in Seed-Dateien
JUnit 5: Wie man Testfälle in enum schreibt
Es scheint kein anderes zu geben - wenn in Java
Ich möchte irgendwann sogar in Kotlin sein
Site-Zusammenfassung, die beim Minecraft-Modding 1.12.2 hilfreich sein wird
Wie schreibe ich Java String # getBytes in Kotlin?
Hinweise zum Schreiben von Kommentaren auf Englisch
Übergeben Sie die im Java8-Lambda-Ausdruck filter () verwendeten Bedingungen als Parameter