fb18.de
/ Bachelorstudieng
/ PM Praktische Informatik
SE1 Übungsblatt 8, Aufgabe 8.2.1
Nabend,
also mein Team hat folgendes Prob:
Es geht darum mit einer Testklasse über ein Interface nen Blackboxtest zu machen. Das Interface steht auch, nur bleibt die Erleuchtung darüber aus, wie man von der Testklasse die Tests aus ausführt ohne auf die Klasse an sich zuzugreifen, sondern eben über das Interface.
Hat jemand nen Tipp wie das geht?
'Schreibt Testklassen zu zwei von den von euch geschriebenen Interfaces (eine Testklasse pro Interface): eure Betreuer bla bla.. Die Testklassen sollten einen Konstruktorparameter haben, dessen Typ dem des jeweiligen Interfaces entspricht. Erzeugt dann interaktiv Exemplare der Implementierung und übergebt sie interaktiv beim Aufruf des Konstruktors der Testklasse.'
Ist jetzt schwierig darauf eine Antwort zu geben, weil eigentlich schon alles im Text steht…
Mit "Interaktiv erzeugen" ist das Erzeugen von Objekten in BlueJ gemeint (falls das nicht klar war).
Kannst Du ansonsten eine konkrete Frage formulieren?
Also konkret, auf die Gefahr hin sich als n00b zu outen.
Das ist der Source:
/**
* Die Test-Klasse IGirokontoTest.
*
* @author KnutBast
* @version 1
*/
public class IGirokontoTest extends junit.framework.TestCase
{
/**
* Konstruktor fuer die Test-Klasse IGirokontoTest
*/
public IGirokontoTest(IGirokonto _konto)
{
// _konto = new Girokonto();
}
/**
* Setzt das Testgeruest fuer den Test.
*
* Wird vor jeder Testfall-Methode aufgerufen.
*/
protected void setUp()
{
}
/**
* Gibt das Testgeruest wieder frei.
*
* Wird nach jeder Testfall-Methode aufgerufen.
*/
protected void tearDown()
{
}
/**
* Testet die Methoden zahleEin und gibSaldo
*/
public void testZahleEinGibSaldo()
{
assertEquals(0, _konto.gibSaldo());
_konto.zahleEin(100);
assertEquals(100, _konto.gibSaldo());
_konto.zahleEin(1000);
assertEquals(1100, _konto.gibSaldo());
}
/**
* Testet die Methoden hebeAb und gibSaldo
*/
public void testHebeAbGibSaldo()
{
_konto.hebeAb(0);
assertEquals(0, _konto.gibSaldo());
_konto.hebeAb(100);
assertEquals(0, _konto.gibSaldo());
_konto.hebeAb(-1100);
assertEquals(0, _konto.gibSaldo());
}
/**
* Testet die Methoden gibDispolimit und setzeDispolimit
*/
public void testSetzeGibDispolimit()
{
assertEquals(0, _konto.gibDispoLimit());
_konto.setzeDispoLimit(1000);
assertEquals(1000, _konto.gibDispoLimit());
}
}
Es lässt sich nicht kompilieren, was ist falsch, wie machen wir es richtig?
public IGirokontoTest(IGirokonto _konto)
{
// _konto = new Girokonto();
}
Das macht doch keinen Sinn… Du bekommst bereits ein Konto als formalen Parameter, danach weist Du _konto aber ein neues Konto zu, indem Du auf den Konstruktor der Klasse zugreifst (was Du öaut Aufgabentext gerade NICHT machen sollst), und anschliessend geht _konto out of scope und ist damit weg.
Speicher stattdessen den Wert des formalen Parameters (welcher NICHT mit einem Unterstrich beginnen sollte) in einer Exemplarvariablen (welche stattdessen mit _ beginnen sollte).
Also // bedeutet auskommentiert. Das greift garnicht, ausgeführter Programmcode ist nur:
public IGirokontoTest(IGirokonto _konto)
{
}
Das auskommentierte is n Rudiment vom schreiben der Testklasse zum Testen der Klasse ohne Interface. Das ganze muss nur jetzt umgemodelt werden.
Wenn du das schon berücksichtigt hast, sollte mein Team vlt doch Kinderpsychologie studieren und kleine Kinder foltern.. :/
Also // bedeutet auskommentiert. Das greift garnicht, ausgeführter Programmcode ist nur:
public IGirokontoTest(IGirokonto _konto)
{
}
Okay, aber wozu einen formalen Parameter entgegennehmen, wenn man ihn ignoriert?
Um eine Information dauerhaft für die gesamte Lebenszeit eines Objektes zu speichern benötigt man eine Exemplarvariable. Eure Klasse definiert aber keine einzige Exemplarvariable. Ist Dir der Unterschied zwischen einer Exemplarvariable und einer lokalen Variable (in diesem Fall ein formaler Parameter) überhaupt klar? Ich meine, es gibt einen Übungszettel, wo über den Sichtbarkeitsbereich/die Lebensdauer von Variablen gesprochen wird. Schau Dir den nochmal genau an.
Ja ne mit der Variable hast recht, die muss bestehend sein und dann mit dem parameter abgeglichen werden. nur von welchem typ muss ich die dann wählen? da blicken wir grad nich so durch. vlt liegts auch an der uhrzeit..
Nur um eventuelle Unklarheiten meinerseits zu beseitigen…
Interaktiv erzeugen sollen wir doch ein Exemplar vom Girokonto (zB "girokon1" oder wie auch immer BlueJ das nennt),
dann sollen wir den Konstruktor der Testklasse aufrufen, der ein Objekt vom Typ des Interfaces vom Girokonto (also Typ IGirokonto) erwartet, und dort "girokon1" von Hand übergeben, oder?
nur von welchem typ muss ich die dann wählen?
Genau der gleiche Typ wie auch der formale Parameter (der Interface Typ).
SgtDirtbag: korrekt
Ja das sollte dann wohl so aussehen nehme ich an:
public class IGirokontoTest extends junit.framework.TestCase
{
private IGirokonto _konto;
/**
* Konstruktor fuer die Test-Klasse IGirokontoTest
*/
public IGirokontoTest(IGirokonto konto)
{
_konto = konto;
}
Wo dann diese Meldung kommt nachm Ausführen der Testklasse…
java.lang.NullPointerException
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at bluej.runtime.RemoteTestRunner.doRun(RemoteTestRunner.java:48)
at bluej.runtime.ExecServer.runTestMethod(ExecServer.java:590)
at bluej.runtime.ExecServer.access$700(ExecServer.java:35)
at bluej.runtime.ExecServer$3.run(ExecServer.java:799)
Übergeben kann man dem parameter auch nichts, da dieser beim Aufrufen der Testklasse nicht als Eingabe verlangt wird, obwohl er ja als Parameter angegeben ist..
Was hab ich da jetzt verpeilt??
Wie kommst Du überhaupt auf JUnit? Das soll bei Aufgabe 8.2.1 noch gar nicht verwendet werden…
Das is ja auch Aufgabe 8.2.2 …
Und wieso steht dann in der Überschrift 8.2.1? Naja wie auch immer, sofern ich mich recht erinnere kommt JUnit erst als letzte Teilaufgabe auf dem Zettel dran. Oder verwechsel ich das jetzt mit einem anderen Zettel?
arg jetzt komm ich selbst ja schon durcheinander.
also es is aufgabe 8.2.1, hatte mich verlesen und dachte du hast 8.1.1 geschrieben.
wie soll man denn die testklasse sonst implementieren?
wie soll man denn die testklasse sonst implementieren?
int x = _konto.gibSaldo();
_konto.einzahlen(50);
if (_konto.gibSaldo() - x != 50) System.out.println("Fehler beim Einzahlen");
So in der Art.
Danke Fred, ich glaube wir denken einfach zu kompliziert und machen es uns damit unnötig schwer…
Ja danke Fred, wie mein Kollege schon sagte ham wirs mal wieder verpeilt mit komplizierter Denkweise…
Habs grad alles umgeschrieben und läuft, danke.