Angenommen ich habe eine Klasse Import.class
Diese liest eine Textdatei und speichert die Daten in einer DB
Nun möchte ich das testen, erstelle ich jetzt eine Kopie der Klasse als @ Test und mache da meine Tests oder greife ich aus der Testklasse auf die "echte" Klasse zu und übergebe die Werte um zu testen was die Methoden in der "echten" Klasse machen?
Ich denke mal letzteres oder? Sonst müsste ich ja immer Anpassungen in beiden Klassen machen
Und Du solltest das auch aufteilen und jede einzelne Funktionalität testen. Das Problem ist, dass vieles sonst nicht oder nur sehr umständlich zu testen ist. Das ist auch der Vorteil von TDD - selbst wenn man TDD nicht durchführt, sollte man es zur Übung einsetzen, denn man bekommt ein Gefühl dafür, wie Code aussehen muss, damit er testbar ist.
Das Beispiel von dir: Klasse liest eine Textdatei ein, wertet diese aus und speichert die Werte in einer Datenbank:
Warum nur eine Klasse? Ich sehe hier mehrere Funktionalitäten! Du liest die Textdatei. Diese enthält ja sowas wie Datensätze. Also hast Du eine Art Reader, der dann die Datensätze ausgeben kann. Dann hast Du die Datensätze selbst. Und dann hast Du noch die Datenbankanbindung, sprich eine Klasse, die so Datensätze lesen / schreiben / löschen kann und so ...
Unabhängig von der Anzahl der Klassen: du solltest es so aufbauen, dass Du möglichst gut testen kannst. Also Abhängigkeiten sollten so gestaltet sein, dass diese z.B. durch Mocking ersetzt werden können. Du willst ja das testen, was Deine Methode macht und nicht die Abhängigkeit, die da mit einspielt. Das wäre so ein anderer Punkt, der mir erwähnenswert ist.
Danke, das war nur vereinfacht dargestellt. Der Reader hat alle Daten (Objekte) nach dem Lesen in einer List und gibt sie weiter. Ich möchte testen, ob die Datei eingelesen werden konnte, sprich es müssen Objekte in der List sein.
Da wäre meines Erachtens das Vorgehen - die Test-Datei liegt unter src/test/resources, der Reader wird erzeugt, liest die Datei ein und der Test testet, dass die Datei korrekt eingelesen wurde.
Und da meine Frage, testet die Testklasse die readMethode oder implemtiert sie die selber? Einfaches Beispiel
Java:
publicclassReader(){privateList<MeinObjekt>readFile(){//Erstellt Objekte und fügt sie in die List einreturn list;}}publicclassReaderTest(){//Implemntiert die selbe Methode?@TestprivateList<MeinObjekt>readFile(String pfadzurdatei){//Erstellt Objekte und fügt sie in die List einreturn list;}//oder nutzt sie die Methode aus der Reader.class@TesttestRead(){Reader reader =newReader();List<MeinObjekt> list = reader.readFile("pfadzurdatei");
assertThat...}}
Und da meine Frage, testet die Testklasse die readMethode oder implemtiert sie die selber? Einfaches Beispiel
Java:
publicclassReader(){privateList<MeinObjekt>readFile(){//Erstellt Objekte und fügt sie in die List einreturn list;}}publicclassReaderTest(){//Implemntiert die selbe Methode?@TestprivateList<MeinObjekt>readFile(String pfadzurdatei){//Erstellt Objekte und fügt sie in die List einreturn list;}//oder nutzt sie die Methode aus der Reader.class@TesttestRead(){Reader reader =newReader();List<MeinObjekt> list = reader.readFile("pfadzurdatei");
assertThat...}}