[JAVA] Être capable d'écrire Hamcrest Matcher dans le style lambda

Si vous implémentez des tests Java avec JUnit + Hamcrest, vous souhaiterez peut-être implémenter le deuxième argument de la méthode assertThat dans une expression lambda. Cependant, comme le type du deuxième argument de assertThat est org.hamcrest.Matcher, il ne correspond pas aux expressions lambda Java 8. (Parce que Hamcrest 2.1 est construit avec Java 7)

J'ai réfléchi à la façon d'implémenter la validation de valeur avec une expression lambda.

Image d'implémentation du test

Le programme suivant est un test pour vérifier si la méthode à vérifier est égale ou inférieure à 0. Matcher quand il est plus petit que la valeur spécifiée est fourni par hamcrest, mais ici ce n'est qu'un échantillon ...

@Test
public void testSum() {
 // Teste si la valeur est inférieure ou égale à 0
    assertThat(new App().sum(10, -20), is(matches(i -> i <= 0, "negative value")));
}

Utilisation efficace

Méthode de réalisation

Implémentez un Matcher personnalisé comme celui ci-dessous. Vous pouvez implémenter un code comme celui ci-dessus en important statiquement ce Matcher personnalisé.

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);
	}
}

En outre, bien que la méthode consiste à recevoir le message de l'appelant en tant que type String, elle peut également être utilisée comme la classe Assertions de JUnit5 en utilisant le type Supplier \ <String >.

J'espère que cela vous sera utile si vous souhaitez tester à l'aide d'expressions lambda dans Hamcrest.

Remarques

--2018 / 12/31 Comme indiqué dans le commentaire, le code de la méthode de mise en œuvre a été corrigé. Merci beaucoup.

Recommended Posts

Être capable d'écrire Hamcrest Matcher dans le style lambda
Je veux pouvoir penser et écrire moi-même des expressions régulières. ..
[Java] Introduction à l'expression lambda
[Introduction à Java] À propos des expressions lambda
Points à noter dans les expressions conditionnelles
Comment utiliser les expressions Java lambda
J'ai essayé de résumer les expressions Java lambda
Pour écrire des données de réponse directement dans Spring
[Ruby] Clé de base pour être fort dans la refactorisation
[Rails] Différentes manières d'écrire dans des fichiers de départ
JUnit 5: Comment écrire des cas de test dans enum
Il ne semble pas y avoir d'autre-si en java
Je veux être finalement même à kotlin
Résumé du site qui sera utile dans Minecraft Modding 1.12.2
Comment écrire Java String # getBytes dans Kotlin?
Notes sur la façon de rédiger des commentaires en anglais
Passer les conditions utilisées dans le filtre d'expression lambda Java8 () comme paramètres