Kontrola výjimek je důležitou součástí vývoje softwaru. Umožňuje zajistit, aby kód správně zpracoval výjimečné situace a zabránil nepředvídatelným chybám. Při používání Mockito k testování je však třeba se vyhnout kontrole kontrolovatelných výjimek.
Mockito je Knihovna pro vytváření a konfiguraci MOV objektů v jednotkových testech. Je široce používán k vytváření falešných objektů, které napodobují chování skutečných komponent v testovacím prostředí. Mockito poskytuje mnoho metod ke kontrole volání metod a hodnot argumentů, nicméně kontrola výjimek není jednou z nich.
Vývojáři Mockito důrazně doporučují vyhnout se kontrole ověřitelných výjimek při používání této knihovny. Věří, že taková kontrola je špatná praxe, která může vést k nepředvídatelným a nesprávným výsledkům testování. Místo toho, Mockito navrhuje použít jiné přístupy ke kontrole výjimek, jako je použití rámce JUnit pro tento účel.
Kontrola výjimek je důležitým aspektem testování, ale při použití Mockito stojí za to odmítnout kontrolu kontrolovatelných výjimek. Místo toho by měly být použity jiné přístupy doporučené vývojáři Mockito.
Mockito: kontrola výjimek
Vyvstává otázka: jak ověřím, že určitá výjimka byla způsobena v testovaném kódu? Ve standardním JUnit můžeme použít kontrolu pomocí anotace @Test (expected = SomeException.ale v Mockitu se takový přístup nedoporučuje.
Důvodem je kontrola kontrolovatelných výjimek, které mohou vést k nesprávnému chování testů. Pokud metoda, kterou testujeme, vynechá výjimku, pak test proběhne úspěšně. Ale pokud metoda změní svou logiku a přestane házet výjimku, testy, které s ní počítají, se mohou rozbít.
Místo kontroly ověřitelných výjimek navrhuje Mockito použít idiom "capture & verify". V praxi to znamená, že můžeme zachytit výjimku, která musí být způsobena během provádění testované metody, a poté zkontrolovat její vlastnosti (zpráva, zásobník-traces atd.).
Capture & verify umožňuje flexibilnější a granulovanější testy, protože můžeme testovat různé vlastnosti výjimek a dokonce kontrolovat, že určitá výjimka není nikdy vyvolána.
Příklad použití "capture & verify" v Mockito:
public class SomeClassTest @Testpublic void testSomeMethod()/ Создаем объект для захвата исключенияArgumentCaptor captor = ArgumentCaptor.forClass(SomeException.class);// Вызываем тестируемый метод, который должен вызывать исключениеsomeClass.someMethod();// Проверяем, что исключение было вызваноverify(someClass).someMethod();verify(someClass).someMethod(captor.capture());// Проверяем свойства захваченного исключенияassertEquals(expectedMessage, captor.getValue().getMessage());. >>
V tomto příkladu používáme ArgumentCaptor k zachycení výjimky SomeException, která musí být způsobena uvnitř metody somethod(). Poté zkontrolujeme, že metoda somethod () byla vyvolána pomocí verify (). Dále prověřujeme vlastnosti zachycené výjimky, například její sdělení.
Na závěr Mockito doporučuje použít idiom "capture & verify" k ověření výjimek v testech. Umožňuje flexibilnější testy a vede k spolehlivějším testům, které se nezlomí, když se změní logika testované metody.
Je nepřípustné používat kontrolu ověřitelných výjimek
Při použití rámce Mockito je základním principem vytváření zástrček (Mock objektů) pro třídy, které interagují s testovaným objektem. Zátky umožňují sledovat chování těchto tříd během testu.
Při použití kontroly ověřitelných výjimek však rámec Mockito nemůže spolehlivě replikovat situaci, kdy dojde k vyloučení a ověření jeho typu a zprávy. Místo toho Mockito očekává, že výjimka bude vyhozena samotným utlumeným předmětem a provedení testu bude přerušeno.
To způsobí, že chyby v programu, které způsobují výjimky, nebudou detekovány a skrývají se před testováním. To může také vést k nesprávným výsledkům, protože Mockito může předpokládat, že výjimka byla vyhozena, když to ve skutečnosti není pravda.
Místo kontroly ověřitelných výjimek se doporučuje použít jiné metody rámce Mockito, jako jsou doThrow() a doAnswer() pro kontrolu chování zástrček v případě, kdy testovaný objekt vypustí výjimku. To umožní přesnější modelování situací a kontrolu správnosti programu.
Při používání rámce Mockito se tedy nedoporučuje používat kontrolu ověřitelných výjimek, aby se předešlo nesprávným výsledkům a skrytí chyb z testování. Místo toho je nutné aktivně používat jiné frameworkové metody ke kontrole chování zástrček a přesné kontrole fungování programu.
Proč by se neměly používat ověřitelné výjimky
Ověřitelné výjimky v Javě představují výjimečné situace, které musí být zpracovány nebo předány výše uvedeným souborem hovorů. Při použití rámce Mockito se však použití ověřitelných výjimek nedoporučuje z mnoha důvodů.
Za prvé, ověřitelné výjimky vytvářejí potřebu je zpracovávat v každé testované metodě. To může vést k nadměrnému kódu a komplikaci samotného testu. Pokud test používá mnoho metod, z nichž každá může ukončit ověřitelnou výjimku, bude muset v každé metodě zahrnout příslušný kód zpracování výjimek.
Za druhé, používání kontrolovaných výjimek komplikuje mokré objekty. Mockito používá mechanismus pro zachycení hovorů metod pomocí proxy objektů. Takový mechanismus však nefunguje s ověřitelnými výjimkami, protože nejsou součástí signatury metody. V důsledku toho je k testování metody, která vrhá ověřitelnou výjimku, nutné použít speciální metody Mockito, které umožňují kontrolovat chování metody, aniž by vyžadovaly zpracování výjimek.
Za třetí, použití kontrolovatelných výjimek může vést ke ztížení kontroly toku provádění testu. Pokud je v rámci testu nutné ověřit, že metoda vyhodí přesně tu výjimku, kterou se očekávalo, pak kontrola ověřitelné výjimky nemusí být dostatečná. V takových případech může být vyžadován zásah do kódu testované metody nebo použití metod Mockito ke kontrole vypuštění konkrétní výjimky.
Použití ověřitelných výjimek v kontextu testování pomocí Mockito se tedy nedoporučuje. Mohou vést k redundanci a komplikaci kódu, komplikaci mokra objektů a komplikaci kontroly toku provádění testů. Místo toho by měly být použity metody Mockito ke kontrole chování metod a vyloučení výjimek.
Problémy s emisemi kontrolovaných výjimek
Jedním z problémů, kterým lze čelit při vypouštění kontrolovatelných výjimek, je nutnost používat konstrukci try-catch ke zpracování výjimek. V případě použití Mockito to může vést k nadměrnému a složitému kódu, který zkomplikuje čtení a porozumění testu.
Dalším problémem je, že ověřitelné výjimky musí být povinně deklarovány v podpisu metody. To znamená, že pokud metoda, kterou chcete otestovat, zahodí ověřitelnou výjimku, budete muset ke všem metodám způsobeným touto metodou přidat příslušné deklarace výjimek. To může vést k řetězcům výjimek v podpisu metod, což je časově náročné a komplikuje pochopení kódu.
Mockito má jiné způsoby, jak zkontrolovat uvolnění výjimek, které nevyžadují použití try-catch nebo přidání ověřitelných výjimek do signatur metod. Jedním z takových způsobů je použití metod, jako je doThrow nebo doAnswer , které umožňují explicitně specifikovat, kdy má být výjimka vyřazena a jakým způsobem musí být tato výjimka zpracována.
Použití těchto způsobů v Mockito je nejčastěji preferováno, protože umožňují flexibilnější řízení emisí výjimek, aniž by komplikovaly kód nebo vytvářely řetězce výjimek v podpisu metod.
V důsledku toho může uvolnění kontrolovatelných výjimek v Mockitu způsobit problémy související s potřebou použití try-catch a přidáním ověřitelných výjimek do signatur metod. Použití alternativních metod kontroly výjimek v Mockito sníží složitost kódu a učiní jej čitelnějším a podporovanějším.
Alternativní přístup: použití MOV objektů
Použití MOV objektů umožňuje zaměřit se na testování konkrétní funkčnosti, aniž by bylo nutné kontrolovat výjimky. MOV objekty umožňují vytvářet závislosti, které se v konkrétním testu chovají tak, jak potřebujeme. Můžeme například vytvořit MOV objekt, který vrátí pevnou hodnotu nebo simuluje vyloučení.
Výhody používání MOV zařízení místo ověřitelných výjimek jsou zřejmé. Za prvé, vyhýbáme se nebezpečí neodhalených výjimek, které by mohly vést k pádu našich testů nebo dokonce aplikace. Za druhé, používání MOV objektů činí naše testy modulárnějšími a nezávislejšími na implementaci závislostí. To nám umožňuje snadno změnit implementaci závislostí, aniž bychom museli upravovat testy.
K vytvoření MOV objektů v Mockito se používá statická metoda mock () nebo anotace @Mock. Dále můžeme upravit chování MOV objektů pomocí metod when () a then (). Můžeme například specifikovat, že při volání určité metody musí MOV objekt vrátit danou hodnotu nebo vyhodit výjimku.
Použití MOV objektů s Mockito nám umožňuje efektivněji testovat náš kód tím, že se vyhýbáme použití kontroly ověřitelných výjimek. Díky tomu jsou naše testy čistší, přehlednější a spolehlivější. Tento přístup nám navíc pomáhá vytvářet flexibilnější a rozšiřitelnější kód.
Výhody využití MOV
- Izolace testovaného kódu. MOV objekty umožňují oddělit testovaný kód od skutečných závislostí. Místo Interakce se skutečnými objekty, které mohou být obtížné konfigurovat nebo provádět určité akce po dlouhou dobu, může testovaný kód interagovat s MOV objekty, které napodobují správné chování. To pomáhá urychlit provádění testů a učinit je nezávislejšími na konkrétní implementaci.
- Flexibilita a ovladatelnost. MOV objekty umožňují programátorovi přesně sledovat chování objektů během testování. To vám umožní emulovat různé skripty a zkontrolovat různé možnosti fungování kódu. MOV objekty lze snadno nakonfigurovat tak, aby vracely určité hodnoty, vyvolávaly určité metody nebo vylučovaly výjimky, což z nich činí velmi flexibilní nástroje při testování.
- Zlepšení rychlosti vývoje. MOV objekty pomáhají soustředit se na testování pouze kódu zájmu, aniž by ovlivnily jiné součásti systému. To zjednodušuje a urychluje proces vývoje a ladění. Při použití MOV objektů není nutné rozbalovat a konfigurovat celý komplex aplikace nebo spouštět dlouhé procesy, což výrazně zkracuje dobu provádění testů.
- Zlepšení udržitelnosti testů. Použití MOV objektů činí testy stabilnějšími a nezávislejšími na vnějších faktorech. To usnadňuje podporu testů při změně požadavků nebo implementaci. V případě potřeby změny chování objektů, se kterými testovaný kód komunikuje, stačí změnit nastavení MOV objektů, nikoli přepsat všechny testy. Tím se snižují náklady na údržbu a rozvoj testovací základny.
Použití MOV objektů umožňuje zvýšit efektivitu testování a učinit kód spolehlivějším. Umožňují programátorům vytvářet flexibilní a nezávislé testy, což přispívá k rychlejšímu vývoji a údržbě aplikací.