JUnit-Tests mit simulierten Benutzereingaben
Ich versuche, um einige JUnit-tests für eine Methode, die Benutzereingaben erforderlich sind. Die zu testende Methode sieht etwas aus wie die folgende Methode:
public static int testUserInput() {
Scanner keyboard = new Scanner(System.in);
System.out.println("Give a number between 1 and 10");
int input = keyboard.nextInt();
while (input < 1 || input > 10) {
System.out.println("Wrong number, try again.");
input = keyboard.nextInt();
}
return input;
}
Gibt es eine Möglichkeit, automatisch an das Programm ein int anstatt mich oder jemand anderes tut dies manuell in der JUnit test-Methode? Wie die Simulation der user-Eingabe?
Vielen Dank im Voraus.
InformationsquelleAutor der Frage Wimpey | 2011-06-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie ersetzen System.in mit Sie eigenen Strom durch den Aufruf System.setIn(InputStream in).
Input-stream byte-array:
Anderen Ansatz kann diese Methode mehr getestet werden, indem IN-und OUT-Parameter:
InformationsquelleAutor der Antwort KrzyH
Testen Sie Ihren code, sollten Sie erstellen einen wrapper für system-input/output-Funktionen. Sie können dies tun, mit dependency injection, die uns eine Klasse, die Fragen für neue Ganzzahlen:
Dann können Sie tests für die Funktion, mit einem mock-framework (ich benutze Mockito):
Dann schreiben Sie Ihre Funktion, dass die tests besteht. Die Funktion ist viel sauberer, da können Sie die Fragen/erste integer-duplizierungen und die eigentlichen Systemaufrufe gekapselt.
Dies mag wie overkill für dein kleines Beispiel, aber wenn Sie eine größere Applikation entwickeln, wie diese können die Auszahlung sehr schnell.
InformationsquelleAutor der Antwort Garrett Hall
Einen gemeinsamen Weg, um zu testen, ähnlichen code zu extrahieren, eine Methode, die in einen Scanner und PrintWriter, ähnlich diese StackOverflow-Antwortund testen:
Tun, beachten Sie, dass Sie nicht in der Lage zu Lesen, Ihre Ausgabe bis Ende, und Sie müssen angeben, alle Ihre input-vorne:
Natürlich, anstatt die Schaffung einer überlastung Methode, Sie könnten auch halten Sie die "scanner" und "Ausgang" als veränderliche Felder in Ihrem system unter test. Ich Neige dazu, halten den Unterricht so zustandslos wie möglich, aber das ist nicht ein sehr großes Zugeständnis, wenn es wichtig ist, für Sie oder Ihre Mitarbeiter/Ausbilder.
Könnten Sie auch wählen, um Ihre test-code in Java-package wie der code under test (auch wenn es in einer anderen Quell-Ordner), die es Ihnen ermöglicht, sich zu entspannen, die Sichtbarkeit der beiden parameter überladen werden package-private.
InformationsquelleAutor der Antwort Jeff Bowman
Könnten Sie anfangen, durch Extraktion aus der Logik, ruft die Nummer über die Tastatur in seine eigene Methode. Dann können Sie testen, die überprüfung der Logik, ohne sich Gedanken über die Tastatur. Zum testen der Tastatur.nextInt() aufrufen, möchten Sie vielleicht zu prüfen, mit einem mock-Objekt.
InformationsquelleAutor der Antwort Sarah Haskins
Habe ich es nützlich gefunden, eine Schnittstelle zu schaffen, die Methoden definiert, ähnlich wie java.io.Konsole und verwenden Sie dann, dass für das Lesen und schreiben von oder in das System.aus. In der realen Implementierung wird delegieren zum System.Konsole (), während Sie Ihre JUnit-version kann ein mock-Objekt mit Konserven-Eingang und erwarteten Antworten.
Beispielsweise würden Sie konstruieren eine MockConsole enthalten, dass die Dosen von den Eingaben des Benutzers. Die mock-Implementierung pop eine input-string aus der Liste jedes mal, wenn readLine aufgerufen wurde. Es wäre auch alles Zusammentragen, was die Ausgabe geschrieben, um eine Liste von Antworten. Am Ende des Tests, wenn alles gut gegangen ist, dann werden alle Ihre Eingaben hätte Lesen und Sie geltend machen kann, auf den Ausgang.
InformationsquelleAutor der Antwort massfords
Ich es geschafft, zu finden, einen einfacheren Weg. Sie haben jedoch für die Verwendung von externen Bibliothek System.Regeln Von @Stefan Birkner
Ich habe nur das Beispiel, glaube ich, es könnte nicht mehr bekommen haben, ist einfacher 🙂
Das problem aber in meinem Fall meine zweite Eingang leer-und das macht die ganze input-stream null !
InformationsquelleAutor der Antwort Omar Elshal
Habe ich das problem behoben zu Lesen von stdin zu simulieren eine Konsole...
Meine Probleme war, möchte ich versuchen, schreiben JUnit-test die Konsole zu erstellen, die ein bestimmtes Objekt...
Das problem ist wie Sie sagen : Wie Kann ich das schreiben in die Standardeingabe von JUnit-test?
Dann im college ich Lerne über Umleitungen, wie Sie sagen System.setIn(InputStream) ändern Sie die stdin filedescriptors und Sie schreiben kann, dann...
Aber es gibt noch eine proble zu beheben... das JUnit test-block warten, Lesen aus Ihrem neuen InputStream, so müssen Sie erstellen, einen thread zu Lesen aus dem InputStream und von JUnit-test-Thread zu schreiben in der neuen Stdin... Zuerst musst du schreiben in die Standardeingabe (Stdin, weil, wenn Sie später schreiben zu erstellen, den Thread zu Lesen von stdin, die Sie wahrscheinlich haben werden race Conditions... kann man das schreiben in den InputStream, bevor Sie zu Lesen oder Sie Lesen vom InputStream, bevor Sie schreiben...
Dies ist mein code, mein Englisch skill ist schlecht, ich hoffe Sie können verstehen das problem und die Lösung zu simulieren, die in stdin schreiben von JUnit-Tests.
InformationsquelleAutor der Antwort Javier Gutiérrez-Maturana Sánc