Hamcrest vlastné zhody

1. Úvod

Rovnako ako vstavané zápalky, Hamcrest tiež poskytuje podporu pre vytváranie vlastných porovnávačov.

V tomto tutoriáli sa bližšie pozrieme na to, ako ich vytvárať a používať. Informácie o dostupných porovnávačoch nájdete v tomto článku.

2. Nastavenie vlastných párovačov

Aby sme dostali Hamcrest, musíme pridajte nasledujúcu závislosť Maven do našej pom.xml:

 org.hamcrest test Java-hamcrest 2.0.0.0 

Najnovšiu verziu Hamcrest nájdete na serveri Maven Central.

3. Predstavujeme TypeSafeMatcher

Skôr ako začneme s našimi príkladmi, je dôležité rozumieť triede TypeSafeMatcher.Budeme musieť rozšíriť túto triedu, aby sme vytvorili vlastný porovnávač.

TypeSafeMatcher je abstraktná trieda, takže všetky podtriedy musia implementovať nasledujúce metódy:

  • zápalky Bezpečne (T t): obsahuje našu logiku zhody
  • descriptionTo (popisný popis): prispôsobí správu, ktorú dostane klient, keď nebude splnená naša logika zhody

Ako môžeme vidieť v prvej metóde, TypeSafeMatcher je parametrizovaný, takže keď budeme používať, budeme musieť typ deklarovať. Bude to typ objektu, ktorý testujeme.

Poďme si to objasniť tým, že sa pozrieme na náš prvý príklad v nasledujúcej časti.

4. Vytvorenie iba číslice Matcher

Pre náš prvý prípad použitia vytvoríme porovnávač, ktorý vráti true, ak je to isté String obsahuje iba číslice.

Takže iba číslice použité na „123“ by sa malo vrátiť pravda zatiaľ čo „ahoj1“A„zbohom”By mal vrátiť hodnotu false.

Začnime!

4.1. Vytvorenie porovnávača

Ak chcete začať s našim porovnávačom, vytvoríme triedu, ktorá sa rozšíri TypeSafeMatcher:

verejná trieda IsOnlyDigits rozširuje TypeSafeMatcher {@Override chránený boolean matchSafely (String s) {// ...} @Override public void descriptionTo (popisný popis) {// ...}}

Upozorňujeme, že keďže objekt, ktorý testujeme, je text, parametrizujeme našu podtriedu TypeSafeMatcher s triedou String.

Teraz sme pripravení pridať našu implementáciu:

verejná trieda IsOnlyDigits rozširuje TypeSafeMatcher {@Override chránené booleovské zápasySafely (String s) {try {Integer.parseInt (s); návrat pravdivý; } catch (NumberFormatException nfe) {return false; }} @Override public void describeTo (Description description) {description.appendText ("only digits"); }}

Ako vidíme, matchSafey sa snaží analyzovať náš vstup String do Celé číslo. Ak uspeje, vráti sa pravda. Ak zlyhá, vráti sa nepravdivé. Úspešne reaguje na náš prípad použitia.

Na druhej strane, descriptionTo pripája text, ktorý predstavuje naše očakávania. Uvidíme, ako sa to ukáže ďalej, keď použijeme náš porovnávač.

Na dokončenie nášho porovnávača potrebujeme iba jednu ďalšiu vec: statickú metódu prístupu k nemu, takže sa chová ako ostatní vstavaní dohadzovači.

Takže pridáme niečo také:

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

A sme hotoví! Pozrime sa, ako použiť tento porovnávač v ďalšej časti.

4.2. Použitie dohadzovača

To použite náš úplne nový porovnávač, vytvoríme test:

@Test public void givenAString_whenIsOnlyDigits_thenCorrect () {String digits = "1234"; assertThat (digits, onlyDigits ()); }

A to je všetko. Tento test bude úspešný, pretože vstup String obsahuje iba číslice. Pamätajte, že aby to bolo trochu čitateľnejšie, môžeme použiť porovnávač je ktorý funguje ako obal nad akýmkoľvek iným porovnávačom:

assertThat (číslice, je (iba číslice ()));

Nakoniec, ak by sme spustili rovnaký test, ale so vstupom „123ABC“, výstupná správa by bola:

java.lang.AssertionError: Očakávaná: iba číslice, ale: bola „123ABC“

Tu vidíme text, ktorý sme pripojili k descriptionTo metóda. Ako sme si mohli všimnúť, je dôležité vytvoriť správny popis toho, čo sa v teste očakáva.

5. deliteľnýBy

Čo by sa stalo, keby sme chceli vytvoriť porovnávač, ktorý by určoval, či je číslo deliteľné iným číslom? Pre tento scenár budeme musieť niekde uložiť jeden z parametrov.

Pozrime sa, ako to môžeme urobiť:

public class IsDivisibleBy extends TypeSafeMatcher {private Integer divider; // konštruktory @Override chránené booleovské zápasySafely (celočíselná dividenda) {if (divider == 0) {return false; } návrat ((dividenda% deliteľ) == 0); } @Override public void describeTo (Description description) {description.appendText ("deliteľné" + rozdeľovač); } public static Matcher divisibleBy (Integer divider) {return new IsDivisibleBy (divider); }}

Dosť jednoduché, práve sme do našej triedy pridali nový atribút a pridelili ho počas výstavby. Potom sme to odovzdali ako parameter našej statickej metóde:

@Test public void givenAnEvenInteger_whenDivisibleByTwo_thenCorrect () {Celé číslo desať = 10; Celé číslo dva = 2; assertThat (desať, je (divisibleBy (dva))); } @Test public void givenAnOddInteger_whenNotDivisibleByTwo_thenCorrect () {Celé číslo jedenásť = 11; Celé číslo dva = 2; assertThat (jedenásť, je (nie (deliteľnýBy (dva)))); }

A je to! Náš matcher už máme viac ako jeden vstup!

6. Záver

Hamcrest poskytuje porovnávače, ktoré pokrývajú väčšinu prípadov použitia, s ktorými sa vývojár zvyčajne musí vyrovnať pri vytváraní tvrdení.

A čo viac, ak nie je zahrnutý žiadny konkrétny prípad, Hamcrest tiež podporuje vytváranie vlastných porovnávačov, ktoré sa majú použiť v konkrétnych scenároch - ako sme tu preskúmali. Ľahko sa vytvárajú a používajú sa presne ako tie, ktoré sú súčasťou knižnice.

Ak chcete získať úplnú implementáciu týchto príkladov, pozrite si projekt GitHub.


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