Programovanie

Hamcrest obsahujúci zápalky

Dokumentácia Hamcrest 1.3 Javadoc pre triedu Matchers pridáva viac dokumentácie pre niekoľko metód tejto triedy, ako bolo k dispozícii v Hamcrest 1.2. Napríklad štyri preťažené metódy obsahujú popisnejšiu dokumentáciu k javadocu, ako je to znázornené na ďalších dvoch snímkach porovnávacej obrazovky.

Aj keď je možné zistiť, ako porovnávače typu „contains“ fungujú, iba ich vyskúšaním, Javadoc v Hamcrest 1.3 uľahčuje čítanie ich fungovania. Väčšina vývojárov Java pravdepodobne myslí na správanie ako String.contains (CharSequence) alebo Collection.contains (Object), keď uvažujú o obsahuje () metóda. Inými slovami, väčšina vývojárov v prostredí Java si asi myslí, že výraz „obsahuje“ popisuje, či reťazec / kolekcia obsahuje poskytnuté znaky / objekty medzi ďalšími možnými znakmi / objektmi. Pre zápasníkov Hamcrest má však „obsahuje“ oveľa konkrétnejší význam. Pretože dokumentácia Hamcrest 1.3 je oveľa jasnejšia, porovnávače „obsahuje“ sú oveľa citlivejšie na počet položiek a poradie položiek, ktoré sa odovzdávajú týmto metódam.

Moje tu uvedené príklady používajú JUnit a Hamcrest. Je dôležité zdôrazniť, že Hamcrestov súbor JAR sa musí objaviť na triednej ceste jednotkových testov pred súborom JUnit JAR, inak musím použiť „špeciálny“ súbor JUnit JAR vytvorený pre použitie so samostatným súborom Hamcrest JAR. Použitím jedného z týchto prístupov sa vyhnete chybám NoSuchMethodError a ďalším chybám (suc ako chyba org.hamcrest.Matcher.describeMismatch), ktoré sú výsledkom nezodpovedajúcich verzií tried. O tejto nuancii JUnit / Hamcrest som písal v blogovom príspevku Moving Beyond Core Hamcrest in JUnit.

Nasledujúce dva snímky obrazovky označujú výsledky (ako je uvedené v NetBeans 7.3) úryvkov kódu testu jednotky, ktoré ukážem neskôr v blogu, aby som demonštroval Hamcrest obsahujúci porovnávače. Predpokladá sa, že testy majú určité neúspechy (7 testov úspešne absolvovalo a 4 testy zlyhali), aby bolo zrejmé, kde porovnávače Hamcrest nemusia fungovať tak, ako to človek očakáva bez prečítania dokumentu Javadoc. Prvý obrázok zobrazuje iba 5 úspešných testov, 2 testy zlyhali a 4 testy spôsobili chyby. Je to preto, že JUnit som uviedol pred Hamcrestom na triednej ceste „Test Libraries“ projektu NetBeans. Druhý obrázok zobrazuje očakávané výsledky, pretože Hamcrest JAR sa vyskytuje pred JUnit JAR v triede projektu „Test Libaries“.

Na účely tejto ukážky musím otestovať jednoduchú vykonštruovanú triedu. Zdrojový kód k tomu Hlavný trieda je uvedená ďalej.

Main.java

balenie zásypu.príklady; importovať java.util.Collections; import java.util.HashSet; import java.util.Set; / ** * Hlavná trieda, ktorá sa má testovať na jednotku. * * @author Dustin * / public class Main {/ ** Používa diamantového operátora Java 7. * / súkromné ​​reťazce Set = nový HashSet (); public Main () {} public boolean addString (final String newString) {return this.strings.add (newString); } public Set getStrings () {return Collections.unmodifiableSet (this.strings); }} 

Keď je zobrazená trieda, ktorá sa má testovať, je teraz čas pozrieť sa na vytvorenie niektorých testov založených na JUnit s porovnávačmi Hamcrest. Testy konkrétne majú zabezpečiť, aby sa reťazce pridávali prostredníctvom triedy addString (reťazec) metóda je v jej základe Nastaviť a prístupné cez internet getStrings () metóda. Ďalej zobrazené metódy testovania jednotiek ukazujú, ako vhodne použiť porovnávače Hamcrest na zistenie, či sú pridané reťazce obsiahnuté v základných vlastnostiach triedy. Nastaviť

Použitie Hamcrest obsahuje () zhody s jedným reťazcom v Set Works

 / ** * Tento test prejde, pretože existuje iba jeden reťazec, a teda bude * obsahovať tento jediný reťazec a poradie bude implicitne správne. * / @Test public void testAddStringAndGetStringsWithContainsForSingleStringSoWorks () {final Hlavný predmet = nový Main (); final boolean resultJava = subject.addString ("Java"); final Set strings = subject.getStrings (); assertThat (reťazce, obsahuje („Java“)); } 

Jednotkový test uvedený vyššie vyhovuje, pretože Nastaviť má v sebe iba jeden reťazec, takže poradie a počet reťazcov testovaných pomocou obsahuje zápasnícke zápasy.

Použitie Hamcrest obsahuje s rovnakým počtom prvkov funguje, ak sa objednávka zhoduje

 / ** * Porovnávač „obsahuje“ očakáva presné poradie, čo v skutočnosti znamená, že by sa nemal * používať v spojení s {@code Set} s. Spravidla táto metóda * bude fungovať a metóda s rovnakým názvom a znakom „2“ na konci nebude fungovať, alebo * naopak. * / @Test public void testAddStringAndGetStringsWithContainsForMultipleStringsNotWorks1 () {final Hlavný predmet = nový Main (); final boolean resultJava = subject.addString ("Java"); final boolean resultGroovy = subject.addString ("Groovy"); final Set strings = subject.getStrings (); assertThat (reťazce, obsahuje ("Java", "Groovy")); } / ** * Porovnávač „obsahuje“ očakáva presné poradie, čo v skutočnosti znamená, že by sa nemal * používať v spojení s {@code Set} s. Spravidla buď táto metóda * bude fungovať a metóda s rovnakým názvom a „1“ na konci nebude fungovať, alebo * naopak. * / @Test public void testAddStringAndGetStringsWithContainsForMultipleStringsNotWorks2 () {final Hlavný predmet = nový Main (); final boolean resultJava = subject.addString ("Java"); final boolean resultGroovy = subject.addString ("Groovy"); final Set strings = subject.getStrings (); assertThat (reťazce, obsahuje ("Groovy", "Java")); } 

Dva ukážkové jednotkové testy uvedené vyššie a ich výsledný výstup z vykonania týchto testov, ako je znázornené na predchádzajúcom snímku obrazovky, ukazujú, že pokiaľ je počet argumentov pre obsahuje () matcher sú rovnaké ako počet reťazcov v testovanej kolekcii, match smieť práca ak testované prvky sú v úplne rovnakom poradí ako prvky v kolekcii. S neusporiadaným Nastaviť, na túto objednávku sa nemožno odvolávať, takže obsahuje () nie je pravdepodobné, že bude dobrým porovnávačom na použitie s testom jednotky na a Nastaviť viac ako jedného prvku.

Používanie Hamcrest obsahuje s rôznym počtom prvkov nikdy nefunguje

 / ** * Demonštrácia, ktorá obsahuje NEPOSKYTNE, ak existuje iný počet * prvkov, na ktoré sa žiada, ako obsahuje v zbierke. * / @Test public void testAddStringAndGetStringsWithContainsNotWorksDifferentNumberElements1 () {final Hlavný predmet = nový Main (); final boolean resultJava = subject.addString ("Java"); final boolean resultGroovy = subject.addString ("Groovy"); final Set strings = subject.getStrings (); assertThat (reťazce, obsahuje („Java“)); } / ** * Demonštrácia, ktorá obsahuje, NEDOSTANE, ak existuje iný počet * prvkov, na ktoré sa žiada, ako v kolekcii, aj keď v * inom poradí. * / @Test public void testAddStringAndGetStringsWithContainsNotWorksDifferentNumberElements2 () {final Hlavný predmet = nový Main (); final boolean resultJava = subject.addString ("Java"); final boolean resultGroovy = subject.addString ("Groovy"); final Set strings = subject.getStrings (); assertThat (reťazce, obsahuje ("Groovy")); } 

Ako naznačujú výsledky skúšky JUnit, tieto dva jednotkové testy nikdy neprejdú, pretože počet prvkov, ktoré sa testujú v Nastaviť je menej ako počet prvkov v Nastaviť. Inými slovami, toto dokazuje, že: obsahuje () porovnávač netestuje iba na to, či je daný prvok v kolekcii: testuje všetky prítomné zadané prvky a v určenom poradí. To môže byť v niektorých prípadoch príliš obmedzujúce, takže teraz prejdem na ďalšie zhody, ktoré Hamcrest poskytuje na určenie, či je prvok obsiahnutý v konkrétnej zbierke.

Používanie zhody HamInrest containsInAnyOrder ()

The containsInAnyOrder matcher nie je taký prísny ako obsahuje () porovnávač: umožňuje prejsť testované prvky v ľubovoľnom poradí v rámci obsahujúcej kolekcie.

 / ** * Test metód addString a getStrings triedy Main pomocou Hamcrest * matcher containsInAnyOrder. * / @Test public void testAddStringAndGetStringsWithContainsInAnyOrder () {final Hlavný predmet = nový Main (); final boolean resultJava = subject.addString ("Java"); final boolean resultCSharp = subject.addString ("C #"); final boolean resultGroovy = subject.addString ("Groovy"); final boolean resultScala = subject.addString ("Scala"); final boolean resultClojure = subject.addString ("Clojure"); final Set strings = subject.getStrings (); assertThat (strings, containsInAnyOrder ("Java", "C #", "Groovy", "Scala", "Clojure")); } / ** * Použite containsInAnyOrder a ukážte, že na poradí nezáleží, pokiaľ * sú všetky poskytnuté položky v kolekcii v určitom poradí. * / @Test public void testAddStringAndGetStringsWithContainsInAnyOrderAgain () {final Main subject = new Main (); final boolean resultJava = subject.addString ("Java"); final boolean resultGroovy = subject.addString ("Groovy"); final Set strings = subject.getStrings (); assertThat (strings, containsInAnyOrder ("Java", "Groovy")); assertThat (strings, containsInAnyOrder ("Groovy", "Java")); } 

Dva jednotkové testy uvedené bezprostredne nad oboma prechádzajú napriek tomu, že testované reťazce boli poskytnuté containsInAnyOrder () porovnávač v inom poradí, než v akom by mohli existovať pre obe zbierky. Avšak tým menej prísnym containsInAnyOrder () matcher stále vyžaduje, aby boli zadané všetky prvky obsahujúcej kolekcie. Nasledujúci test jednotky neprejde, pretože táto podmienka nie je splnená.

 / ** * To sa nepodarí, pretože containsInAnyOrder vyžaduje, aby sa všetky položky zhodovali *, aj keď v inom poradí. Ak bude v kolekcii vyskúšaný iba jeden prvok a dva * prvky, stále zlyhá. Inými slovami, na poradí * nezáleží na containsInAnyOrder, ale všetky prvky v kolekcii * je stále potrebné odovzdať porovnávaču containsInAnyOrder, len nie v * presne rovnakom poradí. * / @Test public void testAddStringAndGetStringsWithContainsInAnyOrderDiffNumberElements () {final Hlavný predmet = nový Main (); final boolean resultJava = subject.addString ("Java"); final boolean resultGroovy = subject.addString ("Groovy"); final Set strings = subject.getStrings (); assertThat (strings, containsInAnyOrder ("Java")); } 

Zhodcovia Hamcrest hasItem () a hasItems () fungujú ako zvuky

Ako je zrejmé z nasledujúcich dvoch testovacích metód jednotky (obe vyhovujú), Hamcrest hasItem () (pre jednu položku) a hasItems (pre viac položiek) úspešne testuje, či kolekcia obsahuje jednu alebo viac zadaných položiek bez ohľadu na poradie alebo počet zadaných položiek. Toto skutočne funguje skôr tak, ako je väčšina vývojárov Java zvyknutá na prácu „obsahuje“ pri práci s reťazcami a kolekciami.

 / ** * Ukážka hasItem () bude fungovať aj pri určovaní, že kolekcia obsahuje * konkrétnu položku. * / @Test public void testAddStringAndGetStringsWithHasItem () {final Hlavný predmet = nový Main (); final boolean resultJava = subject.addString ("Java"); final boolean resultGroovy = subject.addString ("Groovy"); final Set strings = subject.getStrings (); assertThat (strings, hasItem ("Groovy")); assertThat (strings, hasItem ("Java")); } / ** * Ukážka, ktorá hasItems slúži na zistenie, či kolekcia obsahuje jednu * alebo viac položiek a že počet položiek a poradie položiek * nie je pri určovaní úspešnosti / zlyhania významné. * / @Test public void testAddStringAndGetStringsWithHasItems () {final Main subject = new Main (); final boolean resultJava = subject.addString ("Java"); final boolean resultGroovy = subject.addString ("Groovy"); final Set strings = subject.getStrings (); assertThat (strings, hasItems ("Groovy", "Java")); assertThat (strings, hasItems ("Java", "Groovy")); assertThat (strings, hasItems ("Groovy")); assertThat (strings, hasItems ("Java")); } 

Hamcrest isIn () Matcher testuje zadržanie z iného smeru

Práve diskutované hasItem () a hasItems () zápasníci sú menej prísni ako obsahuje () a ešte menej prísne ako containsInAnyOrder () a často sú to, čo človek chce, keď chce jednoducho zabezpečiť, aby jeden alebo viac predmetov bolo niekde v zbierke, bez obáv z poradia predmetov v tejto zbierke alebo z toho, že sa v tejto zbierke nachádzajú ďalšie možné predmety. Ďalším spôsobom, ako použiť Hamcrest na určenie rovnakého vzťahu, ale z opačnej perspektívy, je použiť je v dohadzovač. The je v porovnávač určuje, či je položka niekde v zbierke poskytnutej porovnávačovi bez ohľadu na poradie tejto položky v zbierke alebo či sú alebo nie sú ďalšie položky v zbierke, ktorá obsahuje.

 / ** * Použite porovnávač isIn na otestovanie jednotlivého prvku v poskytnutej kolekcii. * / @Test public void testAddStringAndGetStringsWithIsIn () {final Hlavný predmet = nový Main (); final boolean resultJava = subject.addString ("Java"); final boolean resultGroovy = subject.addString ("Groovy"); final Set strings = subject.getStrings (); assertThat ("Groovy", isIn (strings)); assertThat ("Java", isIn (reťazce)); } 
$config[zx-auto] not found$config[zx-overlay] not found