Testmethode schreiben fiese Falle... Java?
Hallo!
In Software-Entwicklung 2 haben wir ein Java Projekt bekommen. Es ist eine Mediathek in welcher man CDs, DVDs und Videospiele ausleihen kann. Nun habe ich eine Aufgabe gestellt bekommen:
Die Mediathek möchte nun noch Bücher ausleihen. Es gibt eine Methode berechneMietgebuehr, welche als Parameter int mietTage entgegeben nimmt und einen Geldbetrag in Eurocent zurückgibt. Hierzu sei gesagt, dass der Zurückgegebene Wert kein int ist, sondern ein Objekt aus einer Klasse "Geldbetrag". Die Mietgebühr sollte sich folgendermaßen berechnen lassen: 500+mietTage*100 für mietTage >= 0. (Wobei ich persönlich den Fall mietTage = 0 eher blöd finde...)
Nun soll ich eine Testmethode schreiben in dem ich assertEquals benutzte und ein Testexemplar _buch1. Das Problem ist, dass wir laut der Aufgabenstellung nicht wissen wie berechneMietgebuehr wirklich implementiert wurde. Ich habe das erstmal so gemacht:
public void testBerechneMietgebuehr()
{
Geldbetrag geld = new Geldbetrag(700);
assertEquals(geld,_buch1.berechneMietgebuehr(2));
}
Jetzt kommt folgendes Problem. Ich bekomme als Rückmeldung:
Bedeutet: Nun wird mir gesagt, wie berechneMietgebuehr implementiert ist. Und egal was ich bei assertEquals hinein schreibe, die Methode "passt sich an":
Ich weiß nicht wie ich das "umgehen" kann... Ich habe schon versucht alles mal private zu machen oder, damit nicht mehr darauf zugegriffen werden kann, aber das funktioniert auch nicht.
Ich hoffe ihr habt einen Tipp oder vielleicht auch Fragen, falls ich es nicht gut erklären konnte. Danke und LG!
Die Aufgabe ist also quasi eine Simulation so zu bauen, dass die Methode wie sie implementiert ist nicht das zurück gibt, was erwartet ist (richtig?). Nur weiß ich eben nicht wie...
2 Antworten
Dein Ansatz ist eigentlich goldrichtig. Die Fehlermeldung kommt mir aber spanisch vor. Eigentlich sollte der Test entweder durchlaufen oder mit einer Meldung von assertEquals() über zwei verschiedene Geldbeträge abbrechen.
Insbesondere kennt assertEquals() nur die übergebenen Werte und weiß nicht, woher Du sie hast. Warum der Name der zu testenden Funktion in der Meldung erscheint, ist mir ein Rätsel. Entweder ist Dein Lehrer ein Spaßvogel, oder er hat das System versehentlich kaputt konfiguriert.
Probier mal:
public void testBerechneMietgebuehr()
{
Geldbetrag erwartet = new Geldbetrag(700);
Geldbetrag berechnet = _buch1.berechneMietgebuehr(2);
if (berechnet.equals(erwartet)
assertEquals(erwartet, berechnet);
else
assertEquals(erwartet, erwartet);
}
Was passiert dann?
Hirnbatsch! Wenn man schon die Fehlermeldungen konfiguriert, könnte man das auch einfach im Klartext dazu schreiben. Immerhin sollst Du ja programmieren, nicht probieren.
Die konkrete Implementation von berechneMietgebuehr nicht zu kennen, ist kein Problem, denn es soll lediglich geprüft werden, ob die Methode das tut, was sie verspricht. Wenn man also das Argument 2 hineinstopft und dafür das Ergebnis 700 erwartet, ist das korrekt. Wie die Methode es hinbiegt, dieses Ergebnis zu erreichen, kann dir egal sein. Hauptsache, es funktioniert für jeden Anwendungsfall.
Deine Testmethode müsste folgendermaßen zwei Fälle abdecken:
- Das das erwartete Ergebnis bei einer positiven Anzahl an Miettagen berechnet wird.
- Das das erwartete Ergebnis bei einer negativen Anzahl an Miettagen berechnet wird (sei es eine Fehlermeldung, null, o.ä.).
Ich denke der Lehrer ist ein Spaßvogel. Es hat nun geklappt, indem ich drei Testfälle behandelt habe...