Korištenje podudaranja broja Hamcrest

1. Pregled

Hamcrest nudi statička podudaranja koja pomažu u pojednostavljivanju i čitljivosti tvrdnji o jedinstvenom testu. Ovdje možete započeti s istraživanjem nekih dostupnih podudaranja.

U ovom ćemo članku dublje zaroniti u podudaranje brojeva.

2. Postavljanje

Da bismo dobili Hamcrest, samo trebamo dodati sljedeću Mavenovu ovisnost u našu pom.xml:

 org.hamcrest java-hamcrest 2.0.0.0 

Najnoviju verziju Hamcrest možete pronaći na Maven Central.

3. Usporedbe blizine

Prvi set podudaranja koji ćemo pogledati su oni koji provjerite je li neki element blizu vrijednosti +/- pogreška.

Formalnije:

vrijednost - pogreška <= element <= vrijednost + pogreška

Ako je gornja usporedba istinita, tvrdnja će proći.

Idemo to vidjeti na djelu!

3.1. je blizu S Dvostruko Vrijednosti

Recimo da imamo broj pohranjen u dvostrukoj varijabli koja se zove stvarni. I, želimo testirati je li stvarni je blizu 1 +/- 0,5.

To je:

1 - 0,5 <= stvarno <= 1 + 0,5 0,5 <= stvarno <= 1,5

Ajmo sada stvoriti jedinstveni test pomoću je blizu podudaranje:

@Test javna praznina danaADouble_whenCloseTo_thenCorrect () {dvostruka stvarna = 1,3; dvostruki operand = 1; dvostruka pogreška = 0,5; assertThat (stvarni, closeTo (operand, pogreška)); }

Kako je 1,3 između 0,5 i 1,5, test će proći. Na isti način možemo testirati negativni scenarij:

@Test javna praznina danaADouble_whenNotCloseTo_thenCorrect () {dvostruka stvarna = 1,6; dvostruki operand = 1; dvostruka pogreška = 0,5; assertThat (stvarni, ne (closeTo (operand, pogreška))); }

Sada, pogledajmo sličnu situaciju s različitim vrstama varijabli.

3.2. je blizu S BigDecimal Vrijednosti

je blizu je preopterećen i može se koristiti isto kao kod dvostrukih vrijednosti, ali sa BigDecimal predmeta:

@Test javna praznina danaABigDecimal_whenCloseTo_thenCorrect () {BigDecimal actual = novi BigDecimal ("1.0003"); BigDecimalni operand = novi BigDecimal ("1"); Pogreška BigDecimal = novi BigDecimal ("0.0005"); assertThat (stvarni, je (closeTo (operand, pogreška))); } @Test javna praznina danaABigDecimal_whenNotCloseTo_thenCorrect () {BigDecimal actual = novi BigDecimal ("1.0006"); BigDecimalni operand = novi BigDecimal ("1"); Pogreška BigDecimal = novi BigDecimal ("0.0005"); assertThat (stvarno, jest (nije (closeTo (operand, pogreška)))); }

Imajte na umu da the je matcher ukrašava samo ostale matrice bez dodavanja dodatne logike. To samo čini čitavu tvrdnju čitljivijom.

To je otprilike to za blizinske mečeve. Dalje ćemo pogledati podudaranja narudžbi.

4. Narudžbenice

Kao što njihovo ime kaže, ova podudaranja pomažu u utvrđivanju redoslijeda.

Pet ih je:

  • uspoređujeEqualTo
  • većeNego
  • većeNeOrEqualTo
  • manje od
  • lessThanOrEqualTo

Prilično su samorazumljivi, ali pogledajmo nekoliko primjera.

4.1. Naruči podudaranje sa Cijeli broj Valuije

Najčešći scenarij bio bi pomoću ovih podudaranja s brojevima.

Pa, krenimo i stvorimo neke testove:

@Test javna praznina given5_whenComparesEqualTo5_thenCorrect () {Integer five = 5; assertThat (pet, uspoređujeEqualTo (pet)); } @Test javna praznina given5_whenNotComparesEqualTo7_thenCorrect () {Cijeli broj sedam = 7; Cijeli broj pet = 5; assertThat (pet, a ne (uspoređujeEqualTo (sedam))); } @Test javna praznina dana7_whenGreaterThan5_thenCorrect () {Cijeli broj sedam = 7; Cijeli broj pet = 5; assertThat (sedam, je (većeTAN (pet))); } @Test javna praznina dana7_whenGreaterThanOrEqualTo5_thenCorrect () {Cijeli broj sedam = 7; Cijeli broj pet = 5; assertThat (sedam, je (većeTanOrEqualTo (pet))); } @Test javna praznina given5_whenGreaterThanOrEqualTo5_thenCorrect () {Pet broj = 5; assertThat (pet, je (većeTanOrEqualTo (pet))); } @Test javna praznina given3_whenLessThan5_thenCorrect () {Integer three = 3; Cijeli broj pet = 5; assertThat (three, is (lessThan (five))); } @Test javna praznina given3_whenLessThanOrEqualTo5_thenCorrect () {Integer three = 3; Cijeli broj pet = 5; assertThat (three, is (lessThanOrEqualTo (five))); } @Test javna praznina given5_whenLessThanOrEqualTo5_thenCorrect () {Integer five = 5; assertThat (pet, je (lessThanOrEqualTo (pet))); }

Ima smisla, zar ne? Napominjemo kako je jednostavno razumjeti što predikati tvrde.

4.2. Naruči podudaranje sa Niz Vrijednosti

Iako uspoređivanje brojeva ima potpuno smisla, mnogo je puta korisno usporediti druge vrste elemenata. Zato podudaranja narudžbi mogu se primijeniti na bilo koju klasu koja implementira Usporedive sučelje.

Pogledajmo nekoliko primjera s Žice:

@Test javna praznina givenBenjamin_whenGreaterThanAmanda_thenCorrect () {String amanda = "Amanda"; Niz benjamin = "Benjamin"; ustvrdiTo (benjamin, je (većiTan (amanda))); } @Test javna praznina givenAmanda_whenLessThanBenajmin_thenCorrect () {String amanda = "Amanda"; Niz benjamin = "Benjamin"; assertThat (amanda, is (lessThan (benjamin))); }

Niz provodi abecedni red u usporediTo metoda iz Usporedive sučelje.

Dakle, logično je da riječ "Amanda" dolazi ispred riječi "Benjamin".

4.3. Naruči podudaranje sa LocalDate Vrijednosti

Isto kao i kod Žice, možemo usporediti datume. Pogledajmo iste primjere koje smo stvorili gore, ali koristeći ih LocalDate objekti:

@Test javna praznina givenToday_whenGreaterThanY juče_thenCorrect () {LocalDate danas = LocalDate.now (); LocalDate jučer = danas.minusDays (1); assertThat (danas je (većeTan (jučer))); } @Test javna praznina givenToday_whenLessThanTomorrow_thenCorrect () {LocalDate danas = LocalDate.now (); LocalDate sutra = danas.plusDays (1); assertThat (danas je (manjeTan (sutra))); }

Jako je lijepo vidjeti tu izjavu assertThat (danas je (manjeTan (sutra))) blizak je redovnom engleskom.

4.4. Naručite podudaranje s prilagođenom klasomes

Pa, zašto ne bismo stvorili vlastiti razred i implementirali Usporedive? Onuda, možemo iskoristiti podudaranje narudžbi koja će se koristiti s prilagođenim pravilima narudžbe.

Počnimo s izradom a Osoba grah:

javni razred Osoba {Ime niza; int doba; // standardni konstruktor, getteri i postavljači}

Sad, krenimo Usporedive:

javna klasa Osoba implementira Usporedivo {// ... @Preuzmi javni int compareTo (Osoba o) {if (this.age == o.getAge ()) return 0; if (this.age> o.getAge ()) return 1; inače se vrati -1; }}

Naše usporediTo provedba uspoređuje dvoje ljudi prema njihovoj dobi. Stvorimo sada nekoliko novih testova:

@Test javna praznina givenAmanda_whenOlderThanBenjamin_thenCorrect () {Osoba amanda = nova osoba ("Amanda", 20); Osoba benjamin = nova osoba ("Benjamin", 18); assertThat (amanda, je (većeTAN (benjamin))); } @Test javna praznina givenBenjamin_whenYoungerThanAmanda_thenCorrect () {Person amanda = nova osoba ("Amanda", 20); Osoba benjamin = nova osoba ("Benjamin", 18); ustvrdiTo (benjamin, je (manjeTan (amanda))); }

Utakmice će sada raditi na temelju naših usporediTo logika.

5. NaN Matcher

Hamcrest pruža jedno dodatno podudaranje broja da biste definirali je li broj zapravo, a ne broj:

@Test javna praznina givenNaN_whenIsNotANumber_thenCorrect () {dvostruka nula = 0d; assertThat (nula / nula, je (notANumber ())); }

6. Zaključci

Kao što vidiš, podudaranje brojeva vrlo je korisno za pojednostavljivanje uobičajenih tvrdnji.

Štoviše, Hamcrest mečevi općenito jesu samorazumljivo i lako za čitanje.

Sve to, plus mogućnost kombiniranja podudaranja s prilagođenom logikom usporedbe, čine ih moćnim alatom za većinu projekata vani.

Potpuna primjena primjera iz ovog članka može se naći na GitHubu.


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