Abstraktse klassi testimine
04.09.2007 | MarekTihtipeale tuleb ette olukordi, kus baasklass on abstraktne ning peamine funktsionaalsus asub seal. Juhul kui alamklasse on mitu, siis tekkib palju kordusi testkoodis s.t. rikub DRY (Don't Repeat Yourself) printsiipi.

Joonis 1. Klassi diagramm
Seda on võimalik lahendada mitmeti:
- Teha juurdepääsu klass.
- Kasutada Rhino Mocks-ide osaliselt võltsitud objekti.
Juurdepääsu klass
Selleks, et joonisel 1 olevat WorkEffort-klassi saaks testida, tuleks teha juurdepääsu klass. Esmalt teha uus klass testprojekti ning nimetada see näiteks WorkEffortAccessor'iks. Hea tava päraselt võiks teha juurdepääsu klassidele eraldi nimeruumi (namespace). Kui klass on loodud, siis tuleb lisada nende klasside vahele pärilusseos ning kõik abstraktsed meetodid võiksid esialgu tagastada vea, kui neid kutsutatakse.
{
public override double EstimationAccuracy()
{
throw new NotImplementedException();
}
}
Testis on seda võimalik nüüd kasutada järgmiselt:
Osaliselt võltsitud objektide kasutamine
Rhino Mocks-i raamistikus on võimalik luua osaliselt võltsitud objekte. See meetod säästab lisafailide tegemisest, kuid suurendab testimise koodi. Osaliselt võltsitud objekti idee seisneb selles, et need meetodid, mida pole testkoodis üle kirjutatud, kutsutakse lähtekoodist.
public void WorkEffortTest()
{
MockRepository mockery = new MockRepository();
WorkEffort target = mockery.PartialMock<WorkEffort>();
...
mockery.ReplayAll();
...
Assert...
mockery.VerifyAll();
}
Millega tuleks arvetada?
Peamine eelis, mis abstraktse klassi testimine annab on see, et testitakse ainult ühes kohas. Muidugi oleks võimalik testida abstraktse klaasi meetodeid ka kasutades üht alamklassi, kuid see lähenemine ei ole mõistlik:
- abstraktse klassi testkoodi on raske leida,
- alamklassi kustutamisel kaob ka testkood,
- alamklaas võib baasklassi meetodeid üle kirjutada.
Peamine eelis võib ka muutuda suurimaks probleemiks -võib tekkida olukord, kus muudetakse baasklassis funktsionaalust, kuid mõndades alamklassides ei tohi see muutuda. Testidega me seda viga tähele ei pane, sest testid on ainult abstraktse klassi kohta. Seega tasub olla ettevaatlik.
