Při jednotkovém interakčním testování se zaměřujeme na interakce testovaného objektu s jeho sousedy. Testy píšeme tak, že vyvoláme testovanou metodu našeho doménového objektu a sledujeme jeho interakci s ostatními objekty. Na tyto interakce můžeme klást různé požadavky v podobě očekávání (expectations), která verifikujeme a zjišťujeme tak, byl-li test úspěšný či nikoliv.
Jestliže vyvíjíme metodou TDD, tedy píšeme testy dříve než testovaný kód, často využíváme metodu programování do rozhraní. Pomocí tohoto způsobu vývoje jsme potom schopni klást požadavky na doménový kód před tím, než jej implementujeme. To nás nutí přemýšlet nad architekturou tříd dříve než nad jejich implementací, a umoňuje nám tak vytvářet tento kód kvalitnější a návrh čistší.
Příkladem může být naše rozhodnutí, že metoda
userManager.containsUser() je úspěšná v
případě, že její implementace volá metodu
getUserDao().getUserByUsername(). Toto je
rozhodnutí návrhu, které uděláme při vývoji objektu typu
UserManager o implementaci jeho metody. Pokud
implementace rozhraní UserDao ještě tuto metodu
neobsahuje, náš test nebude úspěšný. My ovšem nezačneme vyvíjet tuto
novou vlastnost, protože by to mohlo vést k řetězci implementací dalších
nových funkcí, což by zabrzdilo vývoj naší testované třídy. My tento
objekt nahradíme jeho modelem v podobě mock objektu a nastavíme ho tak,
že tento objekt bude vědět, zda-li jeho metoda
getUserByUsername() je volána v případě
testování metody containsUser().
Ve zkratce řečeno, při jednotkovém interakčním testování nahrazujeme všechny sousedy námi testovaného objektu našimi mock objekty. Tyto objekty sledují a verifikují, zda-li byly volány jejich metody tak, jak očekáváme a nahrazují všechny vlastnosti těch sousedů, které náš testovaný objekt potřebuje.