mockito tutorial mockito framework
Kompletný sprievodca rámcom Mockito: Praktické výukové programy pre Mockito
ako získať rýchle knihy zadarmo
Testovanie jednotiek je jednoduchá, ale efektívna technika na získanie dobrej úrovne dôvery v kód, ktorý sa má odoslať.
Navyše sa vyhýba problémom s regresiou s každým kusom kódu, ktorý sa prihlási.
Vďaka architektúre typu mikroslužieb (a dokonca aj pre jednoduchú štruktúru zahŕňajúcu základné volania do databázy) nestačí priame testovanie jednotiek. Potrebujeme zosmiešniť závislosti a otestovať skutočnú logiku testovanej metódy.
Zoznam VŠETKÝCH tutoriálov pre Mockito v tejto sérii:
Výukový program č. 1: Mockito rámec pre simuláciu pri testovaní jednotiek (Tento návod)
Výukový program č. 2: Vytváranie simulátorov a špiónov v simulátore
Výukový program č. 3: Rôzne typy zápaliek, ktoré poskytuje Mockito
Výukový program č. 4: Posmievanie súkromných, statických a neplatných metód pomocou makety
Výukový program č. 5: Top 12 Mockito Interview Questions
************************************* ********************
Prehľad tutoriálov v tejto sérii Mockito
Návod | Čo sa naučíte |
---|---|
Výukový program č. 1: | Mockito rámec pre simuláciu pri testovaní jednotiek Naučte sa zosmiešňovať pomocou Mockita - komplexný výukový program Mockito pre začiatočníkov s príkladmi kódu. Naučte sa vysmievací rámec pre zosmiešňovanie pri testovaní jednotiek. |
Výukový program č. 2: | Vytváranie simulátorov a špiónov v simulátore Mocks and Spies sú typy testovacích dvojíc, ktoré sú užitočné pri písaní jednotkových testov. Obidve sú vysvetlené v tomto tutoriále Mockito Spy s príkladmi kódu. |
Výukový program č. 3: | Rôzne typy zápaliek, ktoré poskytuje Mockito Naučte sa, ako používať rôzne typy porovnávacích nástrojov, ktoré poskytuje Mockito. Zhody sú ako zástupné znaky, kde namiesto konkrétneho vstupu / výstupu určíte rozsah vstupu. Argument a overenie sú dva typy porovnávačov v Mockito, ktoré sú podrobne vysvetlené tu. |
Výukový program č. 4: | Posmievanie súkromných, statických a neplatných metód pomocou makety Naučte sa vysmievať sa súkromným, statickým a neplatným metódam v aplikácii Mockito s príkladmi. Naučte sa vysmievať sa súkromným a statickým metódam pomocou testovacieho rámca jednotiek PowerMockito. |
Výukový program č. 5: | Top 12 Mockito Interview Questions Mockito Interview Otázky a odpovede s príkladmi vzorových kódov. To vám pomôže úspešne prelomiť akýkoľvek pohovor s Mockito Framework. |
Začnime prvým tutoriálom v tejto sérii !!
Čo sa dozviete:
- Mocking in Unit testing
- Druhy / kategórie testovacích dvojíc
- Rôzne zosmiešňovacie rámce
- Zdrojový kód
- Záver
- Odporúčané čítanie
Mocking in Unit testing
Mocks / Stubs je výraz, ktorý ľudia bežne počujú, najmä pri vytváraní jednotkových testov.
Čo je to teda v podstate posmech? Zjednodušene povedané, nie je to nič iné ako poskytnutie kontrolovanej inštancie alebo implementácia závislosti, od ktorej závisí testovaný kód, aby mohol otestovať svoju základnú logiku.
Dôvod, ktorý som uviedol ako kontrolovanú inštanciu, je ten, že správanie závislosti je možné programovať alebo riadiť podľa potreby pre testovanú metódu alebo systém.
Aby sme si to schematicky vysvetlili, vezmime si príklad akejkoľvek obchodnej alebo elektronickej aplikácie. Takmer každý takýto typ aplikácie má primárne 3 vrstvy, t.j. Používateľské rozhranie, obchodná vrstva a vrstva prístupu k údajom (ktorý hovorí so základným úložiskom dát)
S odkazom na vyššie uvedený diagram má obchodná vrstva 3 závislosti, a to napr. Vrstvu prístupu k údajom a ďalšie 2 služby, ktoré sú službou 1 a službou 2.
Pozerajte sa na to takto - Aplikácia ako google maps môže mať závislosti na
- Skutočné dátové úložiská ako MySQL alebo akákoľvek iná žiadna databáza SQL, ktorá ukladá mapové údaje.
- Externá služba ako CoordinateService, ktorá poskytuje zemepisné šírky a dĺžky miesta.
- Externá služba, ako napríklad dopravná služba, ktorá poskytuje dopravné informácie v reálnom čase pre daný pár súradníc.
Pokiaľ sa teda niekto pokúša overiť základnú obchodnú logiku pomocou testu jednotky, dovtedy a pokiaľ nebude mať funkčné implementácie týchto závislostí, nebude možné testy spustiť.
Makety prichádzajú na záchranu v týchto situáciách, kde bez ohľadu na to, či je vaša závislosť v prevádzke alebo nie, vždy máte zaručené, že svoju obchodnú logiku spustíte s naprogramovanou odpoveďou na závislosť, ktorá sa volá z testovaného kódu.
Druhy / kategórie testovacích dvojíc
Mock je v podstate typ testu „Double“ - je to technický žargón. „Test Double“ v podstate znamená objekt, ktorý je nahradený ekvivalentnou inštanciou alebo závislosťou skutočného objektu.
Ako je uvedené nižšie, existujú rôzne typy testovacích dvojhier:
# 1) Falošné:
Falošná je fungujúca implementácia podobná skutočnej závislosti, okrem skutočnosti, že je lokálna pre testovaný systém.
Príklad: Namiesto zásahu do skutočnej produkčnej databázy test používa na ukladanie údajov jednoduchý zber / pamäť.
# 2) Pahýly:
Záložky sú vopred nakonfigurované odpovede, keď je závislosť volaná z testovaného systému.
# 3) Špióni:
Ako už názov napovedá, jeho skutočná funkcia (závislosť) sa volá s nejakým mechanizmom sledovania. Po zverejnení hovoru je možné overiť, či bol hovor skutočne spustený alebo nie, spolu s parametrami.
# 4) Mocks:
Mocks sú špeciálne inštancie objektov, na ktoré je možné zadať zablokované / predkonfigurované odpovede. Skutočnosť, že sa vysmievali, sa dá overiť ako tvrdenie v teste.
Napríklad:
Existuje funkcia generátora správ, ktorá počas vykonávania odosiela e-mail na zadanú adresu.
Pretože nechceme posielať skutočné e-maily, počas testovania sa služba EmailService vysmieva (a e-mailová metóda, ktorá odosiela e-mail, je nakonfigurovaná tak, aby pri volaní nič nerobila). Na konci testu môžeme iba overiť, či sa prostredníctvom posmešného objektu zavolala metóda odosielania e-mailov e-mailovej služby.
Rôzne zosmiešňovacie rámce
Takmer všetky jazyky poskytujú rôzne druhy zosmiešňujúcich rámcov. Budeme písať ukážkový kód pomocou programu Mockito, čo je open source rámec Mocking pre Java.
Anatómia jednoduchého jednotkového testu so zosmiešňovanou závislosťou. Predpokladajme, že sa pokúšame testovať jednotku, ktorá vypočítava celkové skóre pre študenta zo všetkých predmetov a zapíše ich do DB.
public void calculateSumAndStore(String studentId, int[] scores) { int total = 0; for (int score: scores) { total = total + score; } // write total to DB databaseImpl.updateScores(studentId, total); }
Teraz, ak chceme pre metódu napísať jednotkový test - vypočítaťSumAndStore, možno nebudeme mať skutočnú implementáciu databázy na ukladanie súčtu. V takom prípade nikdy nebudeme môcť testovať túto funkciu.
Ale s falošnými správami môžeme jednoducho odovzdať Mock pre databázovú službu a overiť zvyšok logiky
Vzorový test, ako je uvedené nižšie:
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int[] scores = { 60, 70, 90 }; Mockito.doNothing().when(mockDatabase).updateScores('student1', 220); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores('student1', 220); }
Videli sme vo vyššie uvedenom teste, že sme poskytli objekt mockDatabase materskej triede (pre testovanú metódu) a nastavili sme stub odpoveď pre objekt mockedDatabase - riadok # 6 vyššie (Mockito.doNothing (). When (mockDatabase) .updateScores („student1“, 220);)
Z vyššie uvedeného je potrebné poznamenať tieto dôležité body:
# 1) Vysmievaný objekt musí nastaviť zablokované odpovede pre všetky metódy, ktoré sa budú volať počas vykonávania funkcie.
#dva) Parametre zadané počas vytvárania pahýľa môžu byť špecifické alebo všeobecné.
Príklad v uvedenom prípade - parametre metódy updateScores sme zadali ako „student1“ a 220, pretože vieme, že ide o presné vstupy, pomocou ktorých sa bude naša metóda volať.
# 3) Počas overovania overujeme nasledovné:
- Bola volaná metóda mockDatabase.updateScores.
- Argumenty boli „študent1“, respektíve 220.
- Metóda updateScores bola volaná 1 krát.
Teraz skúsme tento testovací kód trochu zmeniť a uvidíme, čo sa stane:
Zmením argument v simulovanom nastavení z „student1“ na anyString (Mockito poskytuje štandardný matcher s názvom anyString ()) a 220 na anyInteger (Mockito poskytuje štandardný matcher s názvom anyInt () a zodpovedá akejkoľvek celočíselnej hodnote)
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int[] scores = { 60, 70, 90 }; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores('student1', 220); }
Skúste test spustiť znova a test by mal byť stále zelený.
[Teraz skúsme zmeniť overenie / tvrdenia a zmeniť ktorýkoľvek z argumentov.
Poďme zmeniť 220 na 230. Teraz sa očakáva, že test by mal zlyhať, pretože to nie je očakávaný argument, s ktorým sa muselo volať databaseUpdate.
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int[] scores = { 60, 70, 90 }; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores('student1', 230); }
Po vykonaní testu si pozrite protokoly chýb, ako je uvedené nižšie (zreteľne sa v nich uvádza, že skutočné argumenty sa nezhodovali s očakávanými).
Argumenty sa líšia! Chcel:
mockDatabase.updateScores („student1“, 230);
-> na com.mocking.sampleMocks.StudentScoreUpdatesUnitTests.calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb (StudentScoreUpdatesUnitTests.java:37)
Skutočné vyvolanie má rôzne argumenty:
mockDatabase.updateScores („študent1“, 220);
Zdrojový kód
Rozhranie - IDatabase.java
public interface IDatabase { public void updateScores(String studentId, int total); }
Testovaná trieda - StudentScoreUpdates.java
public class StudentScoreUpdates { public IDatabase databaseImpl; public StudentScoreUpdates(IDatabase databaseImpl) { this.databaseImpl = databaseImpl; } public void calculateSumAndStore(String studentId, int[] scores) { int total = 0; for(int score : scores) { total = total + score; } // write total to DB databaseImpl.updateScores(studentId, total); } }
Trieda testov jednotiek - StudentScoreUpdatesUnitTests.java
public class StudentScoreUpdatesUnitTests { @Mock public IDatabase mockDatabase; public StudentScoreUpdates studentScores; @BeforeEach public void beforeEach() { MockitoAnnotations.initMocks(this); } @Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int[] scores = {60,70,90}; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores('student1', 230); } }
Záver
To, čo sme doteraz videli, je veľmi základný a priamy príklad nastavenia Mock pomocou rámca Java Mockito.
Pre takmer 60 - 70% jednotkových testov zahŕňajúcich falošné testy by testy mali mať podobnú štruktúru. Mockito poskytuje veľa pokročilej konfigurácie / podpory pre rozsiahle zosmiešňujúce potreby, vstrekuje falošné inštancie pomocou injekcie závislostí, poskytuje Spiesovi, aby skutočne špehoval skutočné volanie metódy a tieto hovory overil.
Náš nadchádzajúci tutoriál vysvetlí viac o koncepcii Mocks and Spies in Mockito.
Odporúčané čítanie
- 12 najčastejších otázok týkajúcich sa rozhovorov (modelový rozhovor)
- Hĺbkové návody pre zatmenie pre začiatočníkov
- Ako nastaviť testovací rámec Node.js: Výukový program Node.js
- Písanie testov jednotiek s programom Spock Framework
- Rozdiely medzi testovaním jednotiek, testovaním integrácie a funkčným testovaním
- Najlepšie nástroje na testovanie softvéru 2021 [QA Test Automation Tools]
- Výukový program pre deštruktívne testovanie a nedeštruktívne testovanie
- Funkčné testovanie vs. Nefunkčné testovanie