Používanie porovnávačov čísel Hamcrest

1. Prehľad

Hamcrest poskytuje statické porovnávače, ktoré uľahčujú a čitateľnejšie tvrdenia o testovaní jednotky. Tu môžete začať skúmať niektoré z dostupných porovnávačov.

V tomto článku sa ponoríme hlbšie do porovnávačov čísel.

2. Inštalácia

Ak chcete získať Hamcrest, musíme do našej pridať iba nasledujúcu závislosť Maven pom.xml:

 org.hamcrest java-hamcrest 2.0.0.0 

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

3. Proximity Matchers

Prvá skupina dohadzovačov, na ktorú sa pozrieme, je tých skontrolujte, či je niektorý prvok blízko hodnoty +/- chyby.

Formálnejšie:

hodnota - chyba <= prvok <= hodnota + chyba

Ak je vyššie uvedené porovnanie pravdivé, tvrdenie prejde.

Pozrime sa na to!

3.1. je blízko S Dvojitý Hodnoty

Povedzme, že máme číslo uložené v dvojitej premennej, ktorá sa volá skutočné. A chceme vyskúšať, či skutočné je blízko 1 +/- 0,5.

To je:

1 - 0,5 <= skutočná <= 1 + 0,5 0,5 <= skutočná <= 1,5

Teraz vytvorme jednotkový test pomocou je blízko dohadzovač:

@Test public void givenADouble_whenCloseTo_thenCorrect () {double actual = 1.3; dvojitý operand = 1; dvojitá chyba = 0,5; assertThat (real, closeTo (operand, chyba)); }

Pretože 1,3 je medzi 0,5 a 1,5, test prejde. Rovnakým spôsobom môžeme otestovať negatívny scenár:

@Test public void givenADouble_whenNotCloseTo_thenCorrect () {double actual = 1.6; dvojitý operand = 1; dvojitá chyba = 0,5; assertThat (skutočné, nie (closeTo (operand, chyba))); }

Poďme sa teraz pozrieť na podobnú situáciu s iným typom premenných.

3.2. je blízko S BigDecimal Hodnoty

je blízko je preťažený a dá sa použiť rovnako ako pri dvojitých hodnotách, ale s BigDecimal predmety:

@Test public void givenABigDecimal_whenCloseTo_thenCorrect () {BigDecimal actual = nový BigDecimal ("1.0003"); BigDecimal operand = nový BigDecimal ("1"); Chyba BigDecimal = nový BigDecimal ("0,0005"); assertThat (skutocne, je (closeTo (operand, chyba))); } @Test public void givenABigDecimal_whenNotCloseTo_thenCorrect () {BigDecimal actual = new BigDecimal ("1.0006"); BigDecimal operand = nový BigDecimal ("1"); Chyba BigDecimal = nový BigDecimal ("0,0005"); assertThat (skutocne, je (nie (closeTo (operand, chyba)))); }

Vezmite prosím na vedomie, že the je matcher iba zdobí ostatné matcher bez pridania extra logiky. Celé tvrdenie sa tým stáva čitateľnejším.

To je asi všetko pre blízkostných zápasníkov. Ďalej sa pozrieme na porovnávače objednávok.

4. Objednajte porovnávače

Ako hovorí ich meno, títo porovnávači pomáhajú pri presadzovaní tvrdení týkajúcich sa objednávky.

Je ich päť:

  • comparesEqualTo
  • väčší než
  • greaterThanOrEqualTo
  • menej ako
  • lessThanOrEqualTo

Sú do veľkej miery vysvetľujúce, ale pozrime sa na niektoré príklady.

4.1. Objednajte zhadzovače s Celé číslo Values

Najbežnejší scenár by bol pomocou týchto porovnávačov s číslami.

Poďme teda do toho a vytvorme niekoľko testov:

@Test public void given5_whenComparesEqualTo5_thenCorrect () {Celé číslo päť = 5; assertThat (päť, porovnávaEqualTo (päť)); } @Test public void given5_whenNotComparesEqualTo7_thenCorrect () {Celé číslo sedem = 7; Celé číslo päť = 5; assertThat (päť, nie (porovnávaEqualTo (sedem))); } @Test public void given7_whenGreaterThan5_thenCorrect () {Celé číslo sedem = 7; Celé číslo päť = 5; assertThat (sedem, je (väčšíThan (päť))); } @Test public void given7_whenGreaterThanOrEqualTo5_thenCorrect () {Celé číslo sedem = 7; Celé číslo päť = 5; assertThat (sedem, je (greaterThanOrEqualTo (päť))); } @Test public void given5_whenGreaterThanOrEqualTo5_thenCorrect () {Celé číslo päť = 5; assertThat (päť, je (greaterThanOrEqualTo (päť))); } @Test public void given3_whenLessThan5_thenCorrect () {Celé číslo tri = 3; Celé číslo päť = 5; assertThat (tri, je (menejThan (päť))); } @Test public void given3_whenLessThanOrEqualTo5_thenCorrect () {Celé číslo tri = 3; Celé číslo päť = 5; assertThat (tri, je (lessThanOrEqualTo (päť))); } @Test public void given5_whenLessThanOrEqualTo5_thenCorrect () {Celé číslo päť = 5; assertThat (päť, je (lessThanOrEqualTo (päť))); }

Dáva to zmysel, nie? Vezmite prosím na vedomie, aké jednoduché je pochopiť, čo tvrdenia tvrdia.

4.2. Objednajte zhadzovače s String Hodnoty

Aj keď porovnanie čísel dáva úplný zmysel, mnohokrát je užitočné porovnať iné typy prvkov. Preto porovnávače objednávok je možné použiť na každú triedu, ktorá implementuje Porovnateľné rozhranie.

Pozrime sa na niekoľko príkladov s Struny:

@Test public void givenBenjamin_whenGreaterThanAmanda_thenCorrect () {String amanda = "Amanda"; Reťazec benjamin = "Benjamin"; assertThat (benjamin, je (greaterThan (amanda))); } @Test public void givenAmanda_whenLessThanBenajmin_thenCorrect () {String amanda = "Amanda"; Reťazec benjamin = "Benjamin"; assertThat (amanda, is (lessThan (benjamin)))); }

String implementuje abecedné poradie v porovnať s metóda z Porovnateľné rozhranie.

Je logické, že slovo „Amanda“ je pred slovom „Benjamin“.

4.3. Objednajte zhadzovače s LocalDate Hodnoty

Rovnako ako s Struny, môžeme porovnať dátumy. Pozrime sa na tie isté príklady, ktoré sme vytvorili vyššie, ale ktoré používame LocalDate objekty:

@Test public void givenToday_whenGreaterThanYesterday_thenCorrect () {LocalDate today = LocalDate.now (); LocalDatečera = dnes.minusDays (1); assertThat (dnes, je (greaterThan (včera))); } @Test public void givenToday_whenLessThanTomorrow_thenCorrect () {LocalDate today = LocalDate.now (); LocalDate tomorrow = today.plusDays (1); assertThat (dnes, je (lessThan (zajtra))); }

Je veľmi pekné vidieť, že vyhlásenie assertThat (dnes, je (lessThan (zajtra))) má blízko k bežnej angličtine.

4.4. Objednajte si porovnávače s vlastnou triedoues

Prečo si teda nevytvoriť vlastnú triedu a implementovať Porovnateľné? Tým smerom, môžeme použiť porovnávače objednávok na použitie s vlastnými pravidlami objednávok.

Začnime vytvorením a Osoba fazuľa:

verejná trieda Osoba {meno reťazca; int vek; // štandardný konštruktor, getre a setre}

Teraz poďme implementovať Porovnateľné:

verejná trieda Osoba implementuje Porovnateľné {// ... @Override public int compareTo (Osoba o) {if (this.age == o.getAge ()) return 0; if (this.age> o.getAge ()) vráti 1; inak vrátiť -1; }}

Náš porovnať s implementácia porovnáva dvoch ľudí podľa ich veku. Poďme teraz vytvoriť niekoľko nových testov:

@Test public void givenAmanda_whenOlderThanBenjamin_thenCorrect () {Osoba amanda = nová osoba ("Amanda", 20); Osoba benjamin = nová osoba ("Benjamin", 18); assertThat (amanda, is (greaterThan (benjamin))); } @Test public void givenBenjamin_whenYoungerThanAmanda_thenCorrect () {Person amanda = new Person ("Amanda", 20); Osoba benjamin = nová osoba ("Benjamin", 18); assertThat (benjamin, je (lessThan (amanda))); }

Matchers teraz budú pracovať na základe našich porovnať s logika.

5. NaN Matcher

Hamcrest poskytuje jeden zlaďovač čísel navyše, ktorý definuje, či číslo skutočne je, nie číslo:

@Test public void givenNaN_whenIsNotANumber_thenCorrect () {dvojitá nula = 0d; assertThat (nula / nula, je (notANumber ())); }

6. Závery

Ako môžeš vidieť, porovnávače čísel sú veľmi užitočné na zjednodušenie bežných tvrdení.

Navyše Hamcrestoví zápasníci všeobecne sú zrozumiteľné a ľahko čitateľné.

To všetko, plus schopnosť kombinovať porovnávače s vlastnou logikou porovnávania, z nich robí výkonný nástroj pre väčšinu projektov.

Celú implementáciu príkladov z tohto článku nájdete na GitHub.


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