Jarní osvěžení s Mockitem
Zima už je, zdá se, definitivně za námi, a tak, stejně jako budeme v následujících dnech a měsících postupně odkládat všechny ty těžké bundy a kabáty, můžeme odhodit všechno to “heavyweight” programování a ulehčit si psaní testů s testovacím frameworkem Mockito.
Jistě se již každý z vás někdy ocitl v situaci, kdy je postaven před úkol otestovat metodu, která například při svém běhu načítá data z databáze nebo z internetu. Problém s testováním takového kódu je ten, že pro správný průběh testu musíte mít v databázi připravena testovací data a přístup k těmto datům je obecně řádově pomalejší, než bychom potřebovali.
Uvažujme například následující blok kódu v jazyku Java:
public boolean validateUniqueEmail(String email,EntityManager em){ TypedQuery<String> q = em.createQuery("SELECT u.email FROM User u", User.class); List<String> result = q.getResultList(); return !result.contains(email); }
Asi není třeba vysvětlovat, co tato metoda má dělat, avšak pokud byste chtěli testovat správné chování této metody, pak buď musíte připravit v databázi testovací data (pak ale stejně vyvstává otázka, kde vzít instanci EntityManagera), nebo vytvořit vlastní mock pomocí dědění od třídy EntityManager a ten poté vložit jako parametr metody.
Právě s tím Vám pomůže Mockito. V následujícím bloku kódu se nachází testovací metoda, která využívá právě mock EntityManagera, vytvořený Mockitem.
public void testValidateEniqueEmail(){ List<String> testData = new ArrayList<>(); testData.add("email@somewhere.org"); testData.add("email@somewhereelse.com"); // Vytvoreni mock objektu EntityManager mockEM = mock(EntityManager.class); TypedQuery mockQuery = mock(TypedQuery.class); // Definovani chovani mock objektu when(mockQuery.getResultList()).thenReturn(testData); when(mockEM.createQuery(anyString(),String.class)).thenReturn(mockQuery); Assert.assertTrue(validateUniqueEmail("email@unknown.edu",mockEM)); Assert.assertFalse(validateUniqueEmail("email@somewhere.org",mockEM)); }
Jak je patrné z ukázky, vytváření mock objektů je s Mockitem velice snadné. V tomto příkladu jsme definovali testovací data a poté jsme určili chování mock objektů tak, aby při dotazu tato data byla vrácena jako výsledek. Za zmínku zde stojí použití anyString(), což je v terminologii Mockita takzvaný matcher a zastupuje jakoukoli instanci třídy String (samozřejmě lze definovat i vlastní matchery).
Závěr
V tomto článku jsme si ukázali naprosto základní použití frameworku Mockito. Toto je však pouze zlomek toho, co tento nástroj umí a pokud vás tento článek zaujal a chcete se dozvědět více, pak navštivte stránky http://mockito.org/ nebo mě neváhejte kontaktovat na emailové adrese info@bcvsolutions.eu.