Prüfung Konsole-basierte Anwendungen/Programme - Java
Alle,
Ich geschrieben habe, eine Telefonbuch-Applikation, die in Java ist Kommandozeilen-basiert. Die Anwendung im Grunde fragt nach einigen details der Nutzer wie Name, Alter, Adresse und Telefon-Nummern und speichert Sie in einer Datei. Andere Vorgänge beinhalten nachschlagen Telefonbuch nach Namen, Telefonnummer, usw. Alle Angaben werden durch die Konsole.
Ich bin versucht, zu schreiben JUnit-Testfälle für jede der Funktionen, die ich umgesetzt haben, aber nicht in der Lage, herauszufinden, wie die Umleitung System.in
bei der Umsetzung code, um etwas in meinem JUnit-test-Methoden, die liefern würde, die diese Werte bei meinem eigentlichen code für Benutzereingaben beendet?
Beispiel:
Meine Implementierung code:
BufferedReader is = new BufferedReader (new InputStreamReader(System.in));
System.out.println("Please enter your name:");
String name = is.readLine(); //My test cases stop at this line. How can I pass command line values i.e. redirect System.in to my test based values?
Hoffe, es macht Sinn
- Finden Sie einige Beispiel-code, um zu tun, was Sie hier beschreiben: illegalargumentexception.blogspot.com/2010/09/..., Aber es ist im wesentlichen nur ein Weg, um das umzusetzen, was oxbow_lakes beschreibt in seiner Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum schreiben Sie nicht Ihre Anwendung, um eine
Reader
als input? Auf diese Weise können Sie leicht ersetzen eineInputStreamReader(System.in)
mit einemFileReader(testFile)
Und dann zwei Instanzen:
Immer verwendet, um für eine Schnittstelle Code bringt große Vorteile in fast jedem Aspekt Ihrer Programme!
Beachten Sie auch, dass eine
Reader
ist die idiomatischer Weise zu verarbeiten Charakter-basierte Eingabe in Java-Programmen.InputStream
s vorbehalten sein sollte für raw-byte-level-Verarbeitung.tests.txt
? Wenn das der Fall ist, bin ich auf der Suche für die übergabe von Werten durch meine test-Methode, anstatt das erstellen von Dateien, um nur Werte übergeben.Reader
's haben die gleiche Schnittstelle. Verwenden Sie eineFileReader
für Ihre unit-tests, weil es erfordert keine Benutzer-Eingabe (Sie bereiten text-Dateien, die zum Zweck der Prüfung verschiedene Eingänge). Verwenden SieInputStreamReader(System.in)
wenn Sie das Programm auszuführen, das Leben, so dass es dann immer noch Fragen für den Benutzer-input direkt.System.setIn(neue BufferedInputStream(neue FileInputStream("input.txt")));
PipedInputStream
undPipedOutputStream
oder so.Schlage ich vor, Sie zu trennen, den code in drei Teile:
name
in deinem Beispiel)Brauchen Sie nicht, um zu testen, Lesen, Eingabe-und Druck-Ergebnisse, wie der Java-code ist bereits getestet von Menschen, die schreiben von Java.
Das einzige, was Sie brauchen, um zu testen, ist die Sache Sie tun, was auch immer das ist. Unit-tests sind so benannt wie das, weil Sie tests Einheiten von code in der isolation. Sie testen nicht das ganze Programm, testen Sie die kleinen Stücke, die sind selbständig und haben eine gut definierte Funktion.
In unit-tests, Sie sollten sich nicht auf input/output-Operationen. Sollten Sie Eingänge und erwarteten Ausgänge direkt in das Gerät zu testen. Manchmal ist es bequem zu bedienen Lesen der Datei-Operationen zu liefern, Eingang oder Ausgang (z.B. wenn die Datenmenge riesig ist), sondern als eine Allgemeine Regel, je mehr Sie gehen in den Eingang/Ausgang Ihrer unit-tests, die immer komplexer werden und Sie sind eher nicht zu tun Einheit, sondern Integrationstests.
In Ihrem Fall, verwenden Sie
name
irgendwie. Wenn das der einzige parameter, der dann eine Methode - nennen wir esnameConsumer
-, das diesen Namen nimmt, tut etwas und gibt das Ergebnis. In Ihrer unit-tests, etwas wie das hier tun:Bewegen Sie Ihre
println
undreadLine
Anrufe zu anderen Methoden, und verwenden Sie rund umnameConsumer
, aber nicht in Ihre unit-tests.Mehr dazu Lesen Sie hier:
Halten Sie es einfach, es zahlt sich aus.
Die Bibliothek System Regeln bietet die Regel TextFromStandardInputStream für die Simulation Eingang in JUnit-tests.
Details haben Sie einen Blick auf die System-Regeln Dokumentation.
Dauert grundlegende looping-Konsole-Anwendung und macht es getestet, mit den Ideen von oxbow_lakes' Antwort.
Klasse-richtig:
...weiter...
Test (JUnit4):
...weiter...