2010-09-15 3 views
17

Ich möchte JUnit in einem kleinen Projekt implementieren, an dem ich arbeite, weil ich ein bisschen darüber lernen möchte.Wie kann ich Dateien in einem JUnit-Testfall vergleichen?

Die Tutorials, die ich gelesen alle Bezug auf Methoden machen, die einen bestimmten Ausgang.

In meinem Fall sind meine Ausgaben Dateien, wie kann ich das tun? irgendein einfaches Beispiel? irgendein Ansatz, der mir dabei helfen könnte?

Die Dateien sind rohe Textdateien, die durch eine Lücke private Methode bauen.

+0

Wie schreiben die Methoden in die Datei? Wenn sie einen Stream bekommen, können Sie ihnen einfach Ihren eigenen geben, anstatt einen, der auf eine Datei zeigt, und vergleichen Sie sie dann. –

+0

Whith grundlegende Schreibpuffer Zeichenfolge in einem Web-Crawler (ich drücke Enter, aber es schrieb die Nachricht) der Code ist etwa wie folgt: txtUrlSpecial.write (bigText.charAt (j)); – Saikios

Antwort

16

Sie möchten eine korrekte Ausgabedatei für eine bestimmte Menge von Eingaben erhalten und einen Test einrichten, um Ihre void-Methode mit diesen Eingaben aufzurufen, und dann Ihre validierte Ausgabedatei mit den von Ihrer Methode erzeugten Daten vergleichen. Sie müssen sicherstellen, dass Sie eine Möglichkeit haben, anzugeben, wo Ihre Methode ausgegeben werden soll, andernfalls wird Ihr Test sehr brüchig sein.

@Rule 
public TemporaryFolder folder = new TemporaryFolder(); 

@Test 
public void testXYZ() { 
    final File expected = new File("xyz.txt"); 
    final File output = folder.newFile("xyz.txt"); 
    TestClass.xyz(output); 
    Assert.assertEquals(FileUtils.readLines(expected), FileUtils.readLines(output)); 
} 

Verwendet commons-io FileUtils für convinience Textdatei Vergleich & JUnit TemporaryFolder die Ausgabedatei, um sicherzustellen, nie vor den Testläufen besteht.

+0

Ich mag dies, aber warum niemand für Ihre Antwort abstimmen? : S – Saikios

+2

Sie können immer selbst dafür stimmen –

+0

Eclipse sagt, dass org.junit.internal.runners.TestClass veraltet ist = ( – Saikios

2

nach dem Verfahren schreiben Sie die Datei, in dem Unit-Test Sie die Datei lesen und überprüfen, ob es richtig geschrieben wird.

Eine andere Sache, die Sinn Ihre Methoden in einem aufgespalten haben macht, ist, dass die Daten abruft und gibt es die Methoden, die nur in eine Datei schreibt. Dann können Sie überprüfen, ob die von der ersten Methode zurückgegebenen Daten in Ordnung sind.

Und eine andere plausible Ansatz wäre eine OutputStream an die Methode zu übergeben, der die Daten schreibt. Im "echten Code" können Sie eine FileOutputStream/FileWriter übergeben, während Sie im Test-Code eine Mock-Implementierung von OutputStream schreiben und überprüfen können, was darauf geschrieben wird.

1

Wenn Sie die Methode nicht steuern können, um die Ausgabe in einen Stream zu setzen, würde ich sagen, dass Sie Ihren Code umgestalten müssen, damit die Methode einen Stream im Parameter (oder im Konstruktor seiner Klasse) empfängt .

Danach, Test ist recht einfach - man kann nur den Strom überprüfen. Leicht testbarer Code entspricht normalerweise einem guten Code.

+0

Das Problem ist, dass es eigentlich keine einzige Datei macht, sondern zwischen 3 und 5 Dateien, abhängig von verschiedenen Dingen. Aber da ich mit junit wirklich noob bin wollte ich es erstmal mit einer einzigen Datei versuchen um es komplett zu verstehen. Danke = D. – Saikios

+0

@ Saikios das ist relevant für eine beliebige Anzahl von Dateien :) –

1

Obwohl Ihre Frage scheint zu simpel, es schlägt zu Herzen der Komponententests, muss man wohlgeformten Code schreiben, der testbar ist. Aus diesem Grund empfehlen einige Experten, zuerst den Komponententest und dann den Implementierungskurs zu schreiben.

In Ihrem Fall schlage ich vor, dass Sie zulassen, dass Ihre Methode die erwarteten Dateien ausführt und erstellt, wonach Ihre Komponententests analysieren können, ob die Dateien korrekt erstellt wurden.

+0

Danke, ich werde es für das nächste Mal im Hinterkopf haben mache zuerst meinen Komponententest: D – Saikios

+0

Das Stück Code, das die ganze Datei schreibt, ist wahrscheinlich zu groß und komplex.JUnit kann zeigen, ob der Code immer noch funktioniert (keine Regression) und das ist etwas.Jedoch helfen auch wirklich gute Unit-Tests zu finden Was ist kaputt. – h22