Hamcrest Custom Matchers

1. Bemutatkozás

A beépített párosok mellett A Hamcrest támogatást nyújt egyedi párosítók létrehozásához is.

Ebben az oktatóanyagban közelebbről megvizsgáljuk, hogyan lehet létrehozni és használni őket. A rendelkezésre álló mérkőzések bepillantását lásd ebben a cikkben.

2. Egyéni mérkőzések beállítása

Hamcrest megszerzéséhez szükségünk van adjuk hozzá a következő Maven-függőséget pom.xml:

 org.hamcrest java-hamcrest 2.0.0.0 teszt 

A legújabb Hamcrest verzió megtalálható a Maven Central oldalon.

3. Bemutatkozás TypeSafeMatcher

Mielőtt a példáinkkal kezdene, fontos megérteni az osztályt TypeSafeMatcher.Ki kell terjesztenünk ezt az osztályt, hogy létrehozzunk egy saját párost.

TypeSafeMatcher egy absztrakt osztály, ezért minden alosztálynak a következő módszereket kell végrehajtania:

  • mérkőzésekBiztonság (T t): tartalmazza az egyező logikánkat
  • descriptionTo (Leírás leírása): testreszabja az üzenetet, amelyet az ügyfél kap, ha az egyező logikánk nem teljesül

Amint az első módszeren láthatjuk, TypeSafeMatcher paraméterezve van, ezért deklarálnunk kell egy típust, amikor használjuk. Ez lesz az általunk tesztelt objektum típusa.

Tegyük ezt világosabbá a következő szakasz első példájának áttekintésével.

4. A. Létrehozása onlyDigits Matcher

Az első használatra létrehozunk egy párosítót, amely igaz, ha bizonyos Húr csak számjegyeket tartalmaz.

Így, onlyDigits vissza kell térnie a „123” -ra igaz míg „hello1”És„Viszlát”Hamis értéket kell adnia.

Kezdjük el!

4.1. Matcher Creation

Először a párosunkkal létrehozunk egy osztályt, amely kiterjed TypeSafeMatcher:

Az IsOnlyDigits public class kiterjeszti a TypeSafeMatcher {@Orride védett logikai matchSafely (String s) {// ...} @Orride public void descriptionTo (Description description) {// ...}}

Felhívjuk figyelmét, hogy mivel a tesztelni kívánt objektum egy szöveg, paraméterezzük az alosztályunkat TypeSafeMatcher osztályával Húr.

Most készen állunk a megvalósítás hozzáadására:

Az IsOnlyDigits public class kiterjeszti a TypeSafeMatcher {@Orride védett logikai matchSafely (String s) {try {Integer.parseInt (s); return true; } catch (NumberFormatException nfe) {return false; }} @Orride public void descriptionTo (Leírás leírás) {description.appendText ("csak számjegyek"); }}

Ahogy látjuk, mérkőzésekSafey megpróbálja elemezni a bemenetünket Húr egy an Egész szám. Ha sikerül, akkor visszatér igaz. Ha nem sikerül, akkor visszatér hamis. Sikeresen reagál a felhasználási esetünkre.

A másik oldalon, írja le olyan szöveget csatol, amely képviseli az elvárásainkat. Majd meglátjuk, hogy ez hogyan jelenik meg legközelebb, amikor a meccsünket használjuk.

Csak egy dologra van szükségünk, hogy teljesítsük az illesztőnket: statikus módszer a hozzáféréshez, tehát úgy viselkedik, mint a többi beépített páros.

Tehát hozzáadunk valami ilyesmit:

public static only MatcherDigits () {return new IsOnlyDigits (); }

És készen vagyunk! Nézzük meg, hogyan kell használni ezt az egyezőt a következő szakaszban.

4.2. Matcher használata

Nak nek használja a vadonatúj párosítónkat, létrehozunk egy tesztet:

@Test public void givenAString_whenIsOnlyDigits_thenCorrect () {String digits = "1234"; assertThat (számjegy, csakDigits ()); }

És ez az. Ez a teszt sikeres lesz, mert a bemenet Húr csak számjegyeket tartalmaz. Ne feledje, hogy egy kicsit olvashatóbbá tegye, használhatjuk a párosítót van amely burkolóként működik bármely más páros felett:

assertThat (számjegy, is (csakDigits ()));

Végül, ha ugyanazt a tesztet futtattuk, de a „123ABC” bemenettel a kimeneti üzenet a következő:

java.lang.AssertionError: Várható: csak számjegy, de: "123ABC" volt

Itt látjuk a szöveget, amelyhez csatoltuk írja le módszer. Mint észrevehettük, fontos, hogy megfelelő leírást készítsen arról, ami várható a tesztben.

5. osztható

Szóval, mi lenne, ha olyan párosítót szeretnénk létrehozni, amely meghatározza, hogy egy szám osztható-e egy másik számmal? Ennél a forgatókönyvnél az egyik paramétert valahol el kell tárolnunk.

Lássuk, hogyan tehetjük ezt meg:

public class IsDivisibleBy kiterjeszti a TypeSafeMatcher {private Integer osztót; // konstruktorok @Orride védett logikai egyezésekSafely (egész osztalék) {if (osztó == 0) {hamis visszatér; } hozam ((osztalék% osztó) == 0); } @Orride public void descriptionTo (Leírás leírás) {description.appendText ("osztható" + osztó); } public static Matcher divisibleBy (Egész osztó) {return new IsDivisibleBy (osztó); }}

Elég egyszerű, csak egy új attribútumot adtunk az osztályunkhoz, és az építkezés során hozzáadtuk. Ezután csak paraméterként továbbítottuk a statikus módszerünkhöz:

@ Teszt nyilvános érvénytelen adottAnEvenInteger_whenDivisibleByTwo_thenCorrect () {Tíz egész = 10; Kettős egész = 2; assertThat (tíz, van (oszthatóBy (kettő))); } @Test public void givenAnOddInteger_whenNotDivisibleByTwo_thenCorrect () {Egész tizenegy = 11; Kettős egész = 2; assertThat (tizenegy, van (nem (oszthatóBy (kettő)))); }

És ez az! Már van egyezőnk, amely több bemenetet is használ!

6. Következtetés

A Hamcrest olyan párosítókat kínál, amelyek a legtöbb olyan felhasználási esetet lefedik, amelyekkel a fejlesztőknek általában állítások készítésekor kell megküzdeniük.

Sőt, ha bármely konkrét esetre nem térünk ki, A Hamcrest emellett támogatást nyújt egyedi forgatókönyvek létrehozásához, amelyeket speciális forgatókönyvek szerint lehet használni - ahogy itt felfedeztük. Egyszerűen létrehozhatók, és pontosan olyanok, mint a könyvtárban.

A példák teljes megvalósításához olvassa el a GitHub projektet.