De vraag of "how to unit-test een abstracte klasse?" komt vrij vaak. U uit te breiden, dan de abstracte methoden vervangen door categorie: en test vervolgens alleen het concreet deel van de methode? Of ontwikkelt u een abstracte eenheid test?
Wij denken dat dit is waarschijnlijk de verkeerde vraag stellen als het gaat om abstracte klassen. In feite denken wij er is een goede manier om het probleem helemaal te vermijden. Als je kijkt naar een abstract basis klasse er zijn echt twee standaard methoden van het naderen van dit:
De eerste is waar je nodig om zich te specialiseren een abstract object. In dit geval vindt u bijna zeker dat de clients moeten gebruiken de abstracte klasse die u maakt via een basis interface.
Je bent de abstracte klasse om te proberen te bezuinigen op duplicatie gebouw in de tweede plaats. In dat geval zult u snel zien dat de clients daadwerkelijk concrete versies van de klasse openen wanneer zij ze via een interface opent.
Een verandering in de benadering van de ontwikkeling van de software testen
Neemt u de eerste methode die hierboven zal dan u al een interface die volledig zijn gedefinieerd. Dat is door het proces van de virtuele methoden binnen de klassen wordt geïmplementeerd door uw nieuw afgeleide klassen. Waarom niet maken dat een echte interface interface? U verwisselt de abstracte klasse voor een concrete. Neem een momentopname van de nieuwe interface van de constructor. Uw afgeleide klassen kunnen dan gebruik maken van de real-interface.
Dit maakt de abstracte klasse testen eenvoudig. U gebruik een mock-up van de interface en werken via een extra implementaties met behulp van wat is nu een echte interface.
Voor de tweede methode, is dit al functioneert als een helper-klasse. U kunt de functionaliteit binnen die abstracte klasse onderzoeken en proberen en werken in de objecten die u met werkt. Als u er nog steeds materiaal binnen deze klassen vindt wanneer dat wordt gebeëindigd - maken het een helper-klasse in de constructor (Vergeet niet om weg te nemen de basisklasse) en het is een concrete tenuitvoerlegging. Dit is veel gemakkelijker om te testen een abstract.
Het is mogelijk te combineren methoden 1 en 2, en we hebben gevonden dat de beste manier om de aanpak die is om gebruik te maken van de aanpak voor de tweede methode en dan gewoon nemen de overname boom en omzetten in een patroon van de strategie.
De beste manier om eenheid test abstracte klassen is gewoon om de klasse in iets gemakkelijker te hanteren.