Unterschied zwischen Hamcrest-Library-Matchern und Hamcrest-Core-CoreMatchern

71

Es sieht so aus, als ob die Hamcrest- org.hamcrest.MatchersKlasse sehr ähnlich ist org.hamcrest.CoreMatchers(obwohl es so aussieht, als hätte Matcherssie mehr). Warum sollte ich mich für die Verwendung entscheiden CoreMatchers(außer dass die Klasse etwas kleiner aussieht) und warum sind diese beiden Klassen so ähnlich?

Jeff Storey
quelle

Antworten:

53

Die Hamcrest-Matcher sind in mehrere Module unterteilt. Der "Kern" enthält die grundlegendsten Matcher und abstrakten Klassen, die zum Erstellen anderer Matcher erforderlich sind. org.hamcrest.CoreMatchersEnthält die Factory-Methoden nur für diese Matcher. Die anderen Matcher befinden sich im Modul "Bibliothek", gruppiert nach den Objekttypen, mit denen sie übereinstimmen, und sind optional. org.hamcrest.MatchersBeinhaltet beide Matchersätze.

Welches solltest du verwenden? Ich importiere statisch alles ohne Probleme von letzterem. Vielleicht dauern die Kompilierungszeiten etwas länger, aber das war für mich nie ein Problem. Ich habe dies zusätzlich zu den JUnit-Importen ganz oben auf meine Unit-Tests gesetzt:

import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;

Dies ergibt die beste Lesbarkeit in den Testmethoden.

David Harkness
quelle
11

Wenn Sie Mockito häufig verwenden (wie ich), tun Sie möglicherweise Folgendes:

import org.mockito.Mockito;

oder

static import org.mockito.Mockito.*;

und da die MockitoKlasse die Klasse von Mockito erweitert Matchers, kann es zu Konflikten zwischen den Matchers-Klassen oder ihren statischen Methoden kommen. Mit CoreMatchern kann ich von JUnit abgeleitete CoreMatcher in derselben Klasse wie Mockito verwenden, ohne sie an ihrem Verwendungsort vollständig qualifizieren zu müssen.

Kevin Welker
quelle
1

Wenn Sie die JUnit-Tests von Android (nicht verbundene Tests) verwenden, CoreMatcherscheinen die s im bereits enthaltenen Junit- Modul verfügbar zu sein , während dies Matchersnicht der Fall ist .

Um Overhead zu sparen und den Import einer anderen Bibliothek zu vermeiden, sollten Sie die CoreMatcherVersionen dieser Klassen verwenden, wenn sie ausreichen:

assertThat(chrome.twiddle(), is(equalTo(0)));

ist nur mit CoreMatchers möglich .

serv-inc
quelle