Testují funkcionalitu jedné logické části. K tomu je třeba určitá úroveň izolace pro odstínění dalších vrstvev/externích systémů
Tento koncept se často nazývá jako "Test Double"
Existuje více variant těchto testů, dle účelu/chování(není důležité jak objekt vznike).
Testujeme jednak chování tak stav
Dummy
Nejjednodušší
Něco co musíme v testu použít(vyžaduje to signatura), ale SUT s tím nebude interagovat
Umožní nám vyhnout se implementaci a přesto pustit test
null, prázdný objekt, nic nedělající Mock
Fake
Používá se pro zjednodušení závislostí, místo opravdového objektu se do SUT injectne fake.
Fake object je zde ale pouze pro potřeby volání metod(jinak by se nám test nespustil)
Fake nijak neovlivňuje běh testu. Ani volané metody ani vracená data nemají na výsledek testu žádný vliv. Test jen potřebuje aby se vrátilo `true` nebo `success`
např. fake repository které při save/delete vrací OK
Stub
Něco co drží předem definovaná data, která poskytne SUT v průběhu testu.
Používáme když se chceme vyhnout volání další vrstvy/systému ale potřebujeme data pro další běh testu.
Dnes se pro jejich vytváření používají i frameworky jako Mockito.
I když to porušuje některé definice. Hlavně se sním ale nesmí jako s Mockem pracovat
Mock
Stejně jako ostatní se používá jako injectnutý object do SUT s kterým interaguje
Hlavní rozdíl je že zaznamenává na sobě vykonávané operace během testu. (Pokud STUB vytvoříme mockem tak se v něm toto děje i když by nemělo)
V testu pak můžeme tyto akce, resp. jejich (ne)vykonání verifikovat
Spy
Object který je opět injectován do SUT a integraguje s ním
Nevytváří expektace, tedy používá reálné metody, ale současně zaznamenává jejijch volání a umožňuje tak jejich verifikace.
Také se dá použít v případě že potřebujete pro testy změnit 1(nebo více metod) na nějakém objektu, ale zbytek metod nechcete měnit/mockovat a chce použít jejich reálné verze