Unit Test consolen ein-/ausgaben.

kama

Top Contributor
Hallo,

hänge gerade an einem Problem fest...habe folgende Klasse....zu der ich einen Unit Test schreibe...

Java:
public class Interactive {
    private static Logger LOGGER = Logger.getLogger(Interactive.class);

    public static String readString(String prompt) {
        System.out.println(prompt + ": ");
        return readLine();
    }

    public static boolean readYesNo(String prompt) {
        String result = readString(prompt);
        if (result.trim().toLowerCase().startsWith("y")) {
            return true;
        } else {
            return false;
        }
    }

    public static String readPassword(String prompt) {
        String result = null;
        Console cons = System.console();
        char[] passwd;
        if (cons == null) {
            LOGGER.error("Console is null!");
        } else {
            passwd = cons.readPassword("%s: ", prompt);
            // HINT: Security flaw...Not filling up the password it would in
            // memory over the runtime.
            // java.util.Arrays.fill(passwd, ' ');
            result = passwd.toString();
        }
        return result;
    }

    public static String readLine() {
        String strInput = null;
        try {
            BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
            strInput = input.readLine();
            input.close();
        } catch (Exception e) {
            LOGGER.error("Failure during console input:", e);
        }
        return strInput;
    }
}
und der Unit Test (TestNG) sieht derzeit so aus:
Java:
    @BeforeMethod
    public void beforeMethod() {
        LOGGER.info("beforeMethod()");
        out = new ByteArrayOutputStream();
        PrintStream ps = new PrintStream(out);
        StringWriter sw = new StringWriter();
        System.setOut(ps);
        System.setIn(in);
    }

    @AfterMethod
    public void afterMethod() {
        System.setOut(System.out);
        System.setIn(System.in);
    }

    @Test
    public void testApp() {
        Interactive ia = new Interactive();
        String result = ia.readString("This is a Test");
        Assert.assertEquals("Test Input", result);
    }
so nun zu meinem Problem:

In der Method testApp (Unit Test) möchte ich einen String einlesen mit einem Problem. Das Problem dabei ist, dass mithilfe des Unit Tests prüfen möchte, ob meine Routine (readString) so läuft wie sie soll....
Dazu muss ich Daten auf den stdin schreiben (nämlich das was der Benutzer üblicherweise eintippen würde) und auf dem stdout das Ergebnis lesen...

Um nun den stdin umzuleiten (redirect) habe ich per System.setIn(...) einen Stream angegeben...Das Problem dabei ist aber, dass das ein InputStream ist und ich somit auf dem nicht schreiben kann....eventuell habe ich gerade nur ein Dickes Brett vor dem Kopf....

Hat da einer eine Idee oder Vorschlag ?

Gruß
Karl Heinz Marbaise
 

kama

Top Contributor
Hallo,


erst einmal vielen Dank für den Tipp....
habe jetzt meinen Unit Test so geändert:
Java:
    private OutputStream out = null;
    private PipedInputStream pin = null;
    private PipedOutputStream pout = null;

    @BeforeMethod
    public void beforeMethod() throws IOException {
        LOGGER.info("beforeMethod()");
        out = new ByteArrayOutputStream();

        pin = new PipedInputStream();
        pout = new PipedOutputStream();
        PrintStream ps = new PrintStream(out);

        System.setOut(ps);
        pout.connect(pin);
        System.setIn(pin);
    }
und meine Unit Tests sehen jetzt so aus:

Java:
    @Test
    public void readStringTest() throws IOException {
        pout.write("Answer\n".getBytes());
        String result = Interactive.readString("This is a Test");
        Assert.assertEquals("Answer", result);
    }
So funktioniert es jetzt....

Vielen Dank für den Hinweise..

Gruß
Karl Heinz Marbaise
 

kama

Top Contributor
Hi,

so einzig der folgende Code Abschnitt produziert noch probleme....
Java:
public static String readPassword(String prompt) {
        String result = null;
        Console cons = System.console();
        char[] passwd;
        if (cons == null) {
            LOGGER.error("Console is null!");
        } else {
            passwd = cons.readPassword("%s: ", prompt);
            // HINT: Security flaw...Not filling up the password it would in
            // memory over the runtime.
            // java.util.Arrays.fill(passwd, ' ');
            result = passwd.toString();
        }
        return result;
    }
So weit ich es verstehe und gelesen habe liefert mir System.console() nur auf der Command line auch ein Object zurück nicht aber während des Unit Tests....habe gerade mal gestöbert und bin erstaunt....

Gibt es keine einfache Möglichkeit eine Eingabe OHNE das Echo des eingegebenen Zeichens....
Ich habe hier etwas gefunden: Password Masking in the Java Programming Language aber das kommt mir doch sehr kompliziert vor um nur einfach eins Password einzulesen...

Gruß
Karl Heinz Marbaise
 
B

bygones

Gast
die Frage für mich ist - warum willst du die Methode in ihrer Form testen ? Es wäre ein Test der Console und nicht deiner Methode.

Ansonsten ist es ein schönes bsp wie global states / statics testen erschweren bis hin zum verhindern....
 

kama

Top Contributor
Hi bygones,

das Problem habe ich ja beschrieben...Testen funktioniert nicht...
Ich selbst möchte den Code ja auch nicht so haben....habe ich mal eben so hin gesaut bis ich etwas besseres gefunden habe und eben beim Testen bin ich darauf gestoßen dass das nicht funktioniert mit dem Testen...also muss was anderes her...

Gibt es keine einfache Möglichkeit eine Eingabe OHNE das Echo des eingegebenen Zeichens....
Ich habe hier etwas gefunden: Password Masking in the Java Programming Language aber das kommt mir doch sehr kompliziert vor um nur einfach eins Password einzulesen...
Aber da liegt mein Problem....

Gruß
Karl Heinz Marbaisea
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Checkliste Unit Test Allgemeine Java-Themen 17
looparda Unit Test - Abgänigkeit zur Datenbank isolieren Allgemeine Java-Themen 3
R Unit Test Allgemeine Java-Themen 1
Y Wieso krieg ich die Unit Tests nicht hin Allgemeine Java-Themen 55
Y Wie sinnvolle unit tests schreiben Allgemeine Java-Themen 29
sascha-sphw Erste Schritte Unit und Integration-Tests im Java Modul System Allgemeine Java-Themen 10
B Frage zu Unit-Tests Allgemeine Java-Themen 6
J Alle Unit Tests in Maven Modul Projekt ausführen Allgemeine Java-Themen 7
M Für was schreibt man Unit-Tests? Allgemeine Java-Themen 55
P J-Unit vergleich von 2 Objekten merkwürdig Allgemeine Java-Themen 7
G ThreadLocal in Muster "Unit of Work" Allgemeine Java-Themen 7
M Html Unit Whitespace-Problem Allgemeine Java-Themen 4
fastjack Unit-Testen mit Mocks Allgemeine Java-Themen 6
Jay_030 Guice: Frage im Umgang mit Unit-Tests Allgemeine Java-Themen 4
B FileWriter / FileReader testen / Mock-Objekt für Unit Tests? Allgemeine Java-Themen 6
S Unit Testing mit JMock Allgemeine Java-Themen 11
alexpetri unit tests für pdfs Allgemeine Java-Themen 4
B J-Unit Tests. Alle Tests eines Package einsammen. Allgemeine Java-Themen 4
tfa Unit-Tests für private Methoden Allgemeine Java-Themen 25
W Unit Tests im "Hauptprojekt" oder in Modulen Allgemeine Java-Themen 3
M Eine Frage über Unit-Tests mit Java Allgemeine Java-Themen 2
N Ausgaben (System.out) umlenken und in Unit-Tests überprüfen? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
M Archunit Test Allgemeine Java-Themen 0
O Test schreiben mit Äquivalenzklassen (Aufgabe Prüfung) Allgemeine Java-Themen 9
B Junit Test Allgemeine Java-Themen 8
P Karate API Test läuft nicht durch . initializationError Allgemeine Java-Themen 21
J Junit surefire: enrich test information Allgemeine Java-Themen 0
Gaudimagspam White-Box-Test /Glas Box Test Allgemeine Java-Themen 2
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
M Test geht auf Travis und mit Github Action schief aber nicht lokal Allgemeine Java-Themen 3
S Test mit Werten aus der .properties Allgemeine Java-Themen 4
T Weighted QuickUnion Test Allgemeine Java-Themen 5
S Zugriff auf jUnit Test Suite Runner-Instanzen innerhalb von Test Classes Allgemeine Java-Themen 7
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
S Eclipse TestNG Default Test umbenennen Allgemeine Java-Themen 0
F UI Test auf Jenkins Allgemeine Java-Themen 1
K Test-Frist Programmierung - wie vorgehen Allgemeine Java-Themen 5
E JUnit wie Testergebnisse pro Test ("Test Report") erhalten? Allgemeine Java-Themen 1
R Test Umgebung für Datenbank erstellen, was braucht es? Allgemeine Java-Themen 14
M JUnit Test Suites Allgemeine Java-Themen 2
B Hilfe bei JUnit Test Allgemeine Java-Themen 1
E YQL Api Test - NullPointer Allgemeine Java-Themen 9
B JUnit4 Exception-Test Allgemeine Java-Themen 4
A eine test thread.join() frage Allgemeine Java-Themen 2
P Klassen Junit test funktioniert nicht... Allgemeine Java-Themen 11
W Frage zu Klassendesign und Test mit Mockito Allgemeine Java-Themen 5
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
J JUnit, TestCase vs "einfacher" Test Allgemeine Java-Themen 3
1 JUnit Test Suit Allgemeine Java-Themen 2
B Test$1.class mit dem javac compiler Allgemeine Java-Themen 7
G Input/Output System.in "umbiegen" für junit-Test Allgemeine Java-Themen 4
DEvent Test JNI Allgemeine Java-Themen 4
S Theorie hinter Shape intersects Test..? Allgemeine Java-Themen 5
fastjack jUnit und Test von equals, hashCode, toString Allgemeine Java-Themen 11
D junit - frage zu fixtures/test suites Allgemeine Java-Themen 11
G JUnit Test Allgemeine Java-Themen 5
K Test-Code in Java-Klassen verstecken (wie mit Precompiler möglich) Allgemeine Java-Themen 10
J GUI Test Allgemeine Java-Themen 4
G Implementierung vom AKS-Test Allgemeine Java-Themen 11
N ClassNotFound Exception bei JUnit Test? Allgemeine Java-Themen 2
GilbertGrape Warum schlägt JUnit-Test fehl? Allgemeine Java-Themen 19
K Bekomme JUnit TEst nicht zum laufen :( Allgemeine Java-Themen 9
G Ant: <test/> Allgemeine Java-Themen 2
F Kasiski-Test in BlueJ Allgemeine Java-Themen 4
H Java Multiplicoice Test (Part 2) Allgemeine Java-Themen 5
H Java Multiplicoice Test (10 Fragen) Allgemeine Java-Themen 11
F Test für Localization Allgemeine Java-Themen 6
B JUnit - Gleichen Test x-mal durchlaufen Allgemeine Java-Themen 2
H References to generic type Test.A<typ> should be param Allgemeine Java-Themen 5
N Performance-Test (Geschwindigkeit von Methoden vergleichen)? Allgemeine Java-Themen 4
S Performance Test mit JMeter Allgemeine Java-Themen 2
B httpunit test Allgemeine Java-Themen 6
S HTTPUnit Test Fehler: Error on HTTP request: 500 Internal Er Allgemeine Java-Themen 9
M Test eines Programmes Allgemeine Java-Themen 4
B Primzahlen test Allgemeine Java-Themen 3
x22 Unterstreichen eines Consolen-codes Allgemeine Java-Themen 6
M Consolen Ausgabe Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben