Hamcrest Custom Matchers

1. Introduksjon

I tillegg til innebygde matchere, Hamcrest gir også støtte for å lage tilpassede matchere.

I denne opplæringen vil vi se nærmere på hvordan du oppretter og bruker dem. For å få en sniktitt på tilgjengelige matchere, se denne artikkelen.

2. Oppsett av tilpassede matchere

For å få Hamcrest, må vi legg til følgende Maven-avhengighet til vår pom.xml:

 org.hamcrest java-hamcrest 2.0.0.0 test 

Den siste Hamcrest-versjonen finner du på Maven Central.

3. Innføring TypeSafeMatcher

Før du begynner med eksemplene våre, det er viktig å forstå klassen TypeSafeMatcher.Vi må utvide denne klassen for å lage en egen matcher.

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

  • treff Sikkert (T t): inneholder vår matchende logikk
  • beskriv til (beskrivelse beskrivelse): tilpasser meldingen klienten får når vår matchende logikk ikke blir oppfylt

Som vi kan se i den første metoden, TypeSafeMatcher er parametrisert, så vi må erklære en type når vi bruker den. Det vil være typen objektet vi tester.

La oss gjøre dette tydeligere ved å se på vårt første eksempel i neste avsnitt.

4. Opprette bare sifre Matcher

For vår første bruk, vi lager en matcher som returnerer true hvis en viss String inneholder bare sifre.

Så, bare sifre brukt på “123” skal komme tilbake ekte samtidig som "hei1”Og”Ha det”Skal returnere falsk.

La oss komme i gang!

4.1. Matcher Creation

For å starte med vår matcher oppretter vi en klasse som utvides TypeSafeMatcher:

offentlig klasse IsOnlyDigits utvider TypeSafeMatcher {@Override-beskyttede boolske treffSafely (String s) {// ...} @Override public void lýser til

Vær oppmerksom på at ettersom objektet vi skal teste er en tekst, parametrerer vi underklassen vår av TypeSafeMatcher med klassen String.

Nå er vi klare til å legge til implementeringen:

offentlig klasse IsOnlyDigits utvider TypeSafeMatcher {@Override beskyttede boolske treffSikker (String s) {prøv {Integer.parseInt (s); returner sant; } fange (NumberFormatException nfe) {return false; }} @ Override public void descriptionTo (Description description) {description.appendText ("only sifers"); }}

Som vi kan se, matchesSafey prøver å analysere innspillene våre String inn i en Heltall. Hvis det lykkes, kommer det tilbake ekte. Hvis det mislykkes, kommer det tilbake falsk. Det reagerer vellykket på brukssaken vår.

På den andre siden, beskriv til er å legge ved en tekst som representerer våre forventninger. Vi får se hvordan dette viser seg når vi bruker matcheren vår.

Vi trenger bare en ting til for å fullføre matcheren vår: en statisk metode for å få tilgang til den, slik at den oppfører seg som resten av de innebygde matcherne.

Så vi legger til noe som dette:

public static Matcher onlyDigits () {return new IsOnlyDigits (); }

Og vi er ferdige! La oss se hvordan du bruker denne matcheren i neste avsnitt.

4.2. Matcher Bruk

Til bruk vår splitter nye matcher, vi lager en test:

@Test offentlig ugyldighet gittAString_whenIsOnlyDigits_thenCorrect () {String sifre = "1234"; assertThat (sifre, bareDigits ()); }

Og det er det. Denne testen vil bestå fordi inngangen String inneholder bare sifre. Husk at, for å gjøre det litt mer leselig, vi kan bruke matcher er som fungerer som en innpakning over en hvilken som helst annen matcher:

assertThat (sifre, er (onlyDigits ()));

Til slutt, hvis vi kjørte den samme testen, men med inngangen "123ABC", ville utgangsmeldingen være:

java.lang.AssertionError: Forventet: bare sifre men: var "123ABC"

Det er her vi ser teksten vi la ved til beskriv til metode. Som vi kanskje har lagt merke til, det er viktig å lage en riktig beskrivelse av hva som forventes i testen.

5. delelig av

Så hva om vi ønsket å lage en matcher som definerer om et tall kan deles med et annet nummer? For det scenariet, vi må lagre en av parametrene et eller annet sted.

La oss se hvordan vi kan gjøre det:

offentlig klasse IsDivisibleBy utvider TypeSafeMatcher {private Integer divider; // konstruktører @ Overstyr beskyttede boolske treff Sikker (heltall utbytte) {if (divider == 0) {return false; } return ((dividend% divider) == 0); } @Override public void descriptionTo (Description description) {description.appendText ("divisible by" + divider); } offentlig statisk Matcher divisibleBy (Integer divider) {return new IsDivisibleBy (divider); }}

Enkelt nok, vi har nettopp lagt til en ny attributt til klassen vår og tildelt den under byggingen. Så passerte vi det bare som en parameter til den statiske metoden vår:

@Test offentlig ugyldig givenAnEvenInteger_whenDivisibleByTwo_thenCorrect () {Heltall ti = 10; Heltall to = 2; assertThat (ti, er (delbart av (to))); } @Test offentlig ugyldighet givenAnOddInteger_whenNotDivisibleByTwo_thenCorrect () {Heltall elleve = 11; Heltall to = 2; hevder at (elleve, er (ikke (delbart av (to)))); }

Og det er det! Vi har allerede vår matcher som bruker mer enn én innspill!

6. Konklusjon

Hamcrest tilbyr matchere som dekker de fleste brukssaker en utvikler vanligvis må håndtere når de lager påstander.

Hva mer, hvis noen spesifikke tilfeller ikke dekkes, Hamcrest gir også støtte for å lage tilpassede matchere som skal brukes under spesifikke scenarier - som vi har utforsket her. De er enkle å lage, og de brukes akkurat som de som er inkludert i biblioteket.

For å få fullstendig implementering av disse eksemplene, se GitHub-prosjektet.


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