Dus. Ik ben op het moment lekker bezig om unit tests voor mijn programma te schrijven, en tegelijkertijd de zaak te refactoren (wat in dit geval het testen makkelijker maakt, maar mijns insziens het programma zelf ook beter ontworpen maakt).
Nu heb ik in mijn class PietjePuk een functie doeIets(), die op zijn beurt de private doeIetsAnders() aanroept:
Nu ben ik bezig met twee dingen:
1. Vaststellen dat doeIets() ook inderdaad doeIetsAnders() aanroept
2. De test zo eenvoudig mogelijk houden.
Punt 1 moet, bij een goeie test, niet horen, da's bekend. Puntje 2 zit ik echter een beetje mee - stel dat doeIetsAnders() een hele trits aan operaties uitvoert, die ook weer andere zooi uitvoert, waardoor ik heel veel code in mijn tests moet schrijven die niet direct met doeIets() te maken hebben (dwz code die ervoor zorgt dat doeIetsAnders() niet mislukt).
Om puntje 2 aan te pakken, heb ik nu de functionaliteit van doeIetsAnders() uit class PietjePuk gehaald en in zijn eigen class gezet, we noemen het HenkieCola. PietjePuk krijgt nu een instantie van de nieuwe class. Zo kan ik een mock object maken (JMock) van HenkieCola, die toekennen aan PietjePuk, en doeIets() aanroepen. Met behulp van jMock geef ik aan dat doeIets() altijd doeIetsAnders() in HenkieCola aan moet roepen, zodat de test voor doeIets() eenvoudiger wordt. Ook kan ik de tests voor HenkieCola nu in een eigen test unit stoppen.
Genoeg pietjes en henken nu, even concreet weer.
Mijn vraag is nu: Is dit een wijze aanpak? Of zorg ik er hiermee voor dat ik enorme stukken lasagne code schrijf?
Om bijvoorbeeld nu een Servlet z'n doGet() methode eenvoudiger te maken, die eerder vier private functies aanriep (create session, handle request, log exception, close session), heb ik nu een SessionManager, een RequestHandler, en een ExceptionLogger class geschreven, die geinstantieerd en aan de servlet toegekend.
Is dit slim? Of ben ik nu flink bezig om aan over-engineering te doen? Lasagne aan het bakken of (zoals het hoort) nette tortellini aan het maken? Spaghetti is het in ieder geval niet... meer, zover heb ik het al gerefactored.
Wat vinden jullie hiervan? Onderstaand nog een diagrammetje voor de volledigheid - links de originele, rechts de gerefactorde.
Nu heb ik in mijn class PietjePuk een functie doeIets(), die op zijn beurt de private doeIetsAnders() aanroept:
Java:
1
2
3
4
5
6
7
8
9
10
| class PietjePuk { public void doeIets() { // doe iets! doeIetsAnders(); } public void doeIetsAnders() { // doe iets anders } } |
Nu ben ik bezig met twee dingen:
1. Vaststellen dat doeIets() ook inderdaad doeIetsAnders() aanroept
2. De test zo eenvoudig mogelijk houden.
Punt 1 moet, bij een goeie test, niet horen, da's bekend. Puntje 2 zit ik echter een beetje mee - stel dat doeIetsAnders() een hele trits aan operaties uitvoert, die ook weer andere zooi uitvoert, waardoor ik heel veel code in mijn tests moet schrijven die niet direct met doeIets() te maken hebben (dwz code die ervoor zorgt dat doeIetsAnders() niet mislukt).
Om puntje 2 aan te pakken, heb ik nu de functionaliteit van doeIetsAnders() uit class PietjePuk gehaald en in zijn eigen class gezet, we noemen het HenkieCola. PietjePuk krijgt nu een instantie van de nieuwe class. Zo kan ik een mock object maken (JMock) van HenkieCola, die toekennen aan PietjePuk, en doeIets() aanroepen. Met behulp van jMock geef ik aan dat doeIets() altijd doeIetsAnders() in HenkieCola aan moet roepen, zodat de test voor doeIets() eenvoudiger wordt. Ook kan ik de tests voor HenkieCola nu in een eigen test unit stoppen.
Genoeg pietjes en henken nu, even concreet weer.
Mijn vraag is nu: Is dit een wijze aanpak? Of zorg ik er hiermee voor dat ik enorme stukken lasagne code schrijf?
Om bijvoorbeeld nu een Servlet z'n doGet() methode eenvoudiger te maken, die eerder vier private functies aanriep (create session, handle request, log exception, close session), heb ik nu een SessionManager, een RequestHandler, en een ExceptionLogger class geschreven, die geinstantieerd en aan de servlet toegekend.
Is dit slim? Of ben ik nu flink bezig om aan over-engineering te doen? Lasagne aan het bakken of (zoals het hoort) nette tortellini aan het maken? Spaghetti is het in ieder geval niet... meer, zover heb ik het al gerefactored.
Wat vinden jullie hiervan? Onderstaand nog een diagrammetje voor de volledigheid - links de originele, rechts de gerefactorde.
