( persicsb | 2016. 08. 26., p – 13:13 )

"Ha hívódik, de nem jót számol, vagy nem jön exception, az itt most elsikkad, pedig ez lenne a lényeg."
Az az Util.nev() specifikációjának a lényege, nem az Utilt hívó kód specifikációjának a lényege, hogy az Util jól számol-e vagy nem.
Amikor az Utilt hívó kódot ellenőrzöd, neked biztosítanod kell, hogy az Util működjön - valahogy. Lényegtelen, hogy hogyan, azt az Util tesztje ellenőrzi.
Neked csak azt kell ellenőrizned (ennél a viselkedésnél, amikor is egy kódom az Utilt használja), hogy:

  1. Valóban felhasználja az Utilt.
  2. Valóban használja-e az Utillal való interakció eredményét. Ehhez neked kell kívülről a tesztből kontrollálnod, hogy az Utillal való interakció eredménye micsoda. Nem hagyatkozhatsz az Util implementációjára, attól függetlenül kell működnie
  3. Valóban lekezeli-e a ValidationException-t, ha éppen ilyen interakcióra kerül sor az Utillal

Ez nem procedurális programozás, nem valamiből kiszámítunk valamit (igen, vannak ilyen metódusok is, ezeknek primitív típusok a bemenetei mindig), itt legtöbbször objektumok közötti elvárt interakcióról van szó.

Hogy még egyszer:
Igen, a logikát teszteljük.
És ha a logika előírja, hogy márpedig az Utilt használni KELL (mert ez az üzleti logika), akkor azt tesztelni kell.
Van, hogy a logika annyit ír elő, hogy "Ebben a lépésben két számot össze kell adni, meg kell szorozni kettővel. Ha bármely szám nagyobb, mint 100, akkor validációs hibát kell dobni."
Ez esetben az util osztálynak önmagában még nincs is értelme - összesen egy helyen van ilyen feltétel az üzleti logikában, segond.
Amikor eljön az az üzleti logika is a rendszerben, hogy
"Akármikor, amikor két számot össze kell adni, azt validálni kell", akkor erre az üzleti előírásra válaszul születik meg az Util.add(), és a rendszer specifikációja (ami ideális esetben tesztekkel van formalizálva), ezt ki fogja kényszeríteni: minden metódusba belekerül az Util mint paraméter, olyan helyen, ahol az adott metódus specifikációjában két szám összeadása szerepel. És az összeadás lecserélődik Util.add() hívásra a specifikáció szerint.

És innentől kezdve mindenkitől, aki két számot ad össze a rendszerben, elvárjuk, hogy használja az Util.add()-ot. Mivel a specifikációnak a része.

Nem véletlenül bemenete az Util a metódusnak, ennek vagy az osztály adattagjai között, vagy a függvény paraméterei között jelen kell lennie, ha az üzleti logika ezt diktálja.

Persze értem a problémádat, miszerint viselkedést kellene tesztelni mindig, és jó az, ha egy adott összeadás nem használ Utilt, hanem elvégzi, amit az Util amúgy is elvégezne. Azonban nem, valójában specifikációnak megfelelést kell tesztelni mindig. És ha a rendszer specifikációja tartalmazza az Util használatát, akkor azt kell használni.
Mert mondjuk a hívó kódnak nem szabad tudnia innentől kezdve a specifikáció szerint, hogy az Util mit csinál és hogyan csinálja.