Mockování je klíčovou součástí jednotkového testování. Umožňuje izolovat testovaný kus kódu od jeho okolí, jako jsou databáze, externí API nebo souborový systém.
Existuje několik hlavních důvodů, proč místo skutečného objektu použít mock:
Tyto pojmy se často pletou, ale mají rozdílný význam:
Představte si funkci, která zjišťuje počasí a podle toho doporučí oblečení. Místo toho, aby se funkce skutečně připojovala k serveru s počasím, podstrčíte jí mock:
// Definice mocku: "Kdykoliv se tě někdo zeptá na teplotu, řekni, že je -10°C"
weatherMock.setup(temp => -10);
// Spuštění testu
result = doporuc_oblečení(weatherMock);
// Ověření (Assertion)
assertEquals("Vezmi si zimní bundu", result);
Při vývoji mikroslužeb se často používají nástroje pro mockování celých HTTP serverů. Programátor pak nemusí mít spuštěno všech 20 služeb, stačí mu jejich mocky, které simulují správné odpovědi.
Pokud zamockujete úplně všechno, může se stát, že vaše testy sice projdou („v izolaci vše funguje“), ale po nasazení aplikace se zhroutí, protože skutečné komponenty spolu nespolupracují tak, jak jste předpokládali. Proto je nutné doplňovat unit testy také integračními testy.
Zajímavost: Existují pokročilé knihovny (např. Mockito pro Javu, Jest pro JavaScript nebo unittest.mock pro Python), které dokáží automaticky vygenerovat mock objekt na základě existující třídy nebo rozhraní.