Hamcrest Custom Matchers

1. Introduktion

Samt indbyggede matchere, Hamcrest yder også support til oprettelse af tilpassede matchere.

I denne vejledning ser vi nærmere på, hvordan du opretter og bruger dem. For at få et smugkig på de tilgængelige matchere henvises til denne artikel.

2. Opsætning af tilpassede matchere

For at få Hamcrest er vi nødt til det tilføj følgende Maven-afhængighed til vores pom.xml:

 org.hamcrest java-hamcrest 2.0.0.0 test 

Den seneste Hamcrest-version kan findes på Maven Central.

3. Introduktion TypeSafeMatcher

Før du starter med vores eksempler, det er vigtigt at forstå klassen TypeSafeMatcher.Vi bliver nødt til at udvide denne klasse for at skabe en egen matcher.

TypeSafeMatcher er en abstrakt klasse, så alle underklasser skal implementere følgende metoder:

  • matches Sikkert (T t): indeholder vores matchende logik
  • beskriv til (beskrivelse af beskrivelse): tilpasser den besked, som klienten får, når vores matchende logik ikke er opfyldt

Som vi kan se i den første metode, TypeSafeMatcher er parametriseret, så vi bliver nødt til at erklære en type, når vi bruger den. Det vil være typen af ​​det objekt, vi tester.

Lad os gøre dette tydeligere ved at se på vores første eksempel i næste afsnit.

4. Oprettelse af kun cifre Matcher

Til vores første brugssag vi opretter en matcher, der returnerer sand, hvis en bestemt Snor indeholder kun cifre.

Så, kun cifre anvendt til "123" skal vende tilbage rigtigt mens "hej1”Og“farvel”Skal returnere falsk.

Lad os komme igang!

4.1. Matcher Oprettelse

For at starte med vores matcher opretter vi en klasse, der udvides TypeSafeMatcher:

offentlig klasse IsOnlyDigits udvider TypeSafeMatcher {@Override beskyttede boolske matchesSafely (String s) {// ...} @Override offentlig ugyldig beskrivelseTo (beskrivelse af beskrivelse) {// ...}}

Bemærk, at da det objekt, vi tester, er en tekst, parametrerer vi vores underklasse af TypeSafeMatcher med klassen Snor.

Nu er vi klar til at tilføje vores implementering:

offentlig klasse IsOnlyDigits udvider TypeSafeMatcher {@ Override beskyttede boolske matchesSafely (String s) {prøv {Integer.parseInt (s); returner sandt; } catch (NumberFormatException nfe) {return false; }} @ Overstyr offentlig ugyldig beskrivelseTo (beskrivelse af beskrivelse) {beskrivelse.appendText ("kun cifre"); }}

Som vi kan se, matchesSafey forsøger at analysere vores input Snor ind i en Heltal. Hvis det lykkes, vender det tilbage rigtigt. Hvis det mislykkes, vender det tilbage falsk. Det reagerer med succes på vores brugssag.

På den anden side, beskrive til vedhæfter en tekst, der repræsenterer vores forventninger. Vi får se, hvordan dette viser sig, når vi bruger vores matcher.

Vi har kun brug for en ting mere for at færdiggøre vores matcher: en statisk metode til at få adgang til den, så det opfører sig som resten af ​​de indbyggede matchere.

Så vi tilføjer noget som dette:

public static only MatchDigits () {returner nye IsOnlyDigits (); }

Og vi er færdige! Lad os se, hvordan du bruger denne matcher i det næste afsnit.

4.2. Matcher-brug

Til Brug vores helt nye matcher, vi opretter en test:

@Test offentligt ugyldigt givetAString_whenIsOnlyDigits_thenCorrect () {String cifre = "1234"; assertThat (cifre, kunDigits ()); }

Og det er det. Denne test vil bestå, fordi input Snor indeholder kun cifre. Husk at for at gøre det lidt mere læseligt, vi kan bruge matcheren er der fungerer som en indpakning over enhver anden matcher:

assertThat (cifre, er (onlyDigits ()));

Endelig, hvis vi kørte den samme test, men med input "123ABC", ville outputmeddelelsen være:

java.lang.AssertionError: Forventes: kun cifre men: var "123ABC"

Det er her, vi ser teksten, som vi tilføjede til beskrive til metode. Som vi måske har bemærket, det er vigtigt at oprette en korrekt beskrivelse af, hvad der forventes i testen.

5. delelig af

Så hvad hvis vi ønskede at oprette en matcher, der definerer, om et nummer kan deles med et andet nummer? For dette scenario, vi bliver nødt til at gemme en af ​​parametrene et eller andet sted.

Lad os se, hvordan vi kan gøre det:

offentlig klasse IsDivisibleBy udvider TypeSafeMatcher {privat heltal divider; // constructors @Override beskyttede boolske matchesSafely (Integer dividend) {if (divider == 0) {return false; } return ((dividend% divider) == 0); } @ Override offentligt tomrum beskrivelseTo (beskrivelse af beskrivelse) {beskrivelse.appendText ("delelig med" + skillevæg); } offentlig statisk Matcher divisibleBy (Integer divider) {return new IsDivisibleBy (divider); }}

Enkelt nok, vi tilføjede netop en ny attribut til vores klasse og tildelte den under byggeriet. Derefter sendte vi det lige som en parameter til vores statiske metode:

@ Test offentlig ugyldighed givenAnEvenInteger_whenDivisibleByTwo_thenCorrect () {Heltal ti = 10; Heltal to = 2; hævder, at (ti, er (delelig med (to))); } @ Test offentligt ugyldigt givenAnOddInteger_whenNotDivisibleByTwo_thenCorrect () {Heltal elleve = 11; Heltal to = 2; hævder, at (elleve, er (ikke (delelig med (to)))); }

Og det er det! Vi har allerede vores matcher, der bruger mere end en input!

6. Konklusion

Hamcrest leverer matchere, der dækker de fleste brugssager, som en udvikler normalt har at gøre med, når de opretter påstande.

Hvad mere er, hvis en bestemt sag ikke er dækket, Hamcrest giver også support til at oprette brugerdefinerede matchere, der skal bruges under specifikke scenarier - som vi har udforsket her. De er enkle at oprette, og de bruges nøjagtigt som dem, der er inkluderet i biblioteket.

For at få den komplette implementering af disse eksempler henvises til GitHub-projektet.


$config[zx-auto] not found$config[zx-overlay] not found