[Java] Ich möchte Standardeingabe und Standardausgabe mit JUnit testen

Auslösen

Vor kurzem habe ich angefangen, wettbewerbsfähige Programmierung zu studieren. Es ist schwierig, jedes Mal einzugeben, wenn der Vorgang lokal überprüft wird. Ich möchte es mit JUnit machen.

Umgebung

Artikel, auf die verwiesen wird

Qiita - Standardeingabe in JUnit drücken Kenkobas Standard-E / A für Tagebuchdiebstahl Nyoki Nyoki Blog - Ersetzen wir System.out

Überblick

Sie können das Ausgabeziel und das Eingabeziel von der Standardausgabe und -eingabe mit setOut und setIn der Klasse System ändern. Sie können eine Klasse definieren und festlegen, die "PrintStream" für Out und "InputStream" für In erbt.

Implementierung

Erstellen Sie Eingabe- und Ausgabeklassen.

Eingabeklasse --StandardInputStream

StandardInputStream.java


import java.io.InputStream;

public class StandardInputStream extends InputStream {
    private StringBuilder sb = new StringBuilder();
    private String lf = System.getProperty("line.separator");

    /**
     *Geben Sie eine Zeichenfolge ein. Zeilenumbrüche werden automatisch durchgeführt
     * @param str Eingabezeichenfolge
     */
    public void inputln(String str){
        sb.append(str).append(lf);
    }

    @Override
    public int read() {
        if (sb.length() == 0) return -1;
        int result = sb.charAt(0);
        sb.deleteCharAt(0);
        return result;
    }
}

Ausgabeklasse --StandardOutputStream

StandardOutputStream.java


import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.io.StringReader;

public class StandardOutputStream extends PrintStream {
    private BufferedReader br = new BufferedReader(new StringReader(""));

    public StandardOutputStream() {
        super(new ByteArrayOutputStream());
    }

    /**
     *Lesen Sie eine Zeile der Zeichenfolge
     * @Zeichen zurückgeben, die keine Zeilenumbrüche enthalten. Null für die Kündigung
     */
    public String readLine() {
        String line = "";
        try {
            if ((line = br.readLine()) != null) return line;
            br = new BufferedReader(new StringReader(out.toString()));
            ((ByteArrayOutputStream) out).reset();
            return br.readLine();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

Zu testender Code

Der zu testende Code wird vom atcoder ausgeliehen. PracticeA - Welcome to AtCoder

** Problem ** Gegeben sind die ganzen Zahlen a, b, c und die Zeichenfolge s. Zeigen Sie das Berechnungsergebnis von a + b + c und die Zeichenfolge nebeneinander an.

** Eingabe **

a b c s




#### **`WelcomeToAtCoder.java`**
```java

import java.util.Scanner;

public class WelcomeToAtCoder {
    public static void main(String[] args) {
        try (Scanner sc = new Scanner(System.in)) {
            int r = sc.nextInt();
            r += sc.nextInt();
            r += sc.nextInt();
            String s = sc.next();
            System.out.println(r + " " + s);
        }
    }
}

Testcode

WelcomeToAtCoderTest.java


import WelcomeToAtCoder;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import util.io.StandardInputStream;
import util.io.StandardOutputStream;

import static org.hamcrest.CoreMatchers.is;

public class WelcomeToAtCoderTest {

    private StandardInputStream in = new StandardInputStream();
    private StandardOutputStream out = new StandardOutputStream();

    @Before
    public void before() {
        System.setIn(in);
        System.setOut(out);
    }

    @After
    public void after() {
        System.setIn(null);
        System.setOut(null);
    }

    @Test
    public void main01() {
        in.inputln("1");
        in.inputln("2 3");
        in.inputln("hoge");
        WelcomeToAtCoder.main(null);
        Assert.assertThat(out.readLine(), is("6 hoge"));
    }
}

Test durch Umschalten von Ein- / Ausgang in der Vorverarbeitung.

abschließend

Es ist einfach, Testfälle zu schreiben, daher denke ich, dass es einfacher zu implementieren ist. Nicht darauf beschränkt, entschied ich mich, den Test richtig zu schreiben. Ich möchte TDD studieren. ~~ JUnit Ich habe es nach langer Zeit berührt ~~

Recommended Posts

[Java] Ich möchte Standardeingabe und Standardausgabe mit JUnit testen
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
[Java] So testen Sie, ob es in JUnit null ist
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (PowerMockito Edition)
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Sogar in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Javassist zweite Abkochung)
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 (Black Magic) ausgeben.
(´-`) .. oO (Ich möchte die Standardausgabe" Hallo "leicht finden.
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Ich habe versucht, mit Java zu interagieren
[Java] Testen Sie private Methoden mit JUnit
Ich möchte verschiedene Funktionen mit Kotlin und Java implementieren!
Ich möchte mit Java8 StreamAPI redu () einen anderen Typ als das Eingabeelement zurückgeben.
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Ich möchte DBViewer mit Eclipse 2018-12 verwenden! !!
Ich möchte einen Unit Test schreiben!
Einführung eines automatisierten Java-Tests mit JUnit 5 + Gradle
[Java] Färben Sie die Standardausgabe an das Terminal
Ich möchte Bilder mit REST Controller von Java und Spring anzeigen!
[Java] Ich möchte es einfacher machen, weil es schwierig ist, System.out.println einzugeben
Schreiben wir die Eingabe / Ausgabe von Java-Dateien mit NIO
[CircleCI 2.0] [Java] [Maven] [JUnit] Aggregieren Sie die JUnit-Testergebnisse mit CircleCI 2.0
R von Java ausführen Ich möchte rJava ausführen
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Ich möchte eine E-Mail in Java senden.
So testen Sie Interrupts während Thread.sleep mit JUnit
rsync4j - Ich möchte rsync in Java berühren.
Ich möchte mit Firestore von Rails spielen
Ich habe versucht, neunundneunzig in Java auszugeben
Ich möchte schnell von Java nach SQLite schreiben
Ich habe versucht, den Block mit Java zu brechen (1)
Ich möchte die Aggregationsverarbeitung mit Spring-Batch durchführen
[Rails] Ich möchte CSS mit Webpacker laden
[Rails] Ich möchte mit RSpec testen. Wir unterstützen Ihren Schritt [Einführungsverfahren]
Ich habe den Eingabe- / Ausgabetyp von Java Lambda ~ POJO Edition ~ ausprobiert
Ich möchte so etwas wie "cls" in Java machen
[Java] Ich möchte die Differenz zum Datum berechnen
Ich habe versucht, CSV mit Outsystems zu lesen und auszugeben
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
[Java 11] Ich habe versucht, Java auszuführen, ohne mit Javac zu kompilieren
Wie kann ich IBM Mainframe-Dateien in Java eingeben / ausgeben?
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
[Java] Verschlüsselung mit AES-Verschlüsselung mit Standardbibliothek
Ich habe den Eingabe- / Ausgabetyp von Java Lambda ~ Stream Version ~ ausprobiert
Ich möchte den Dunkelmodus mit der SWT-App verwenden
Ich möchte eine bestimmte Datei mit WatchService überwachen
Ich möchte Benutzer mit Devise + OmniAuth bei Rails authentifizieren
So geben Sie einen Standard aus einem Array mit for Each aus
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
Paiza Skill Check Standard Eingabe / Ausgabe Zusammenfassung [Java Edition]
Ich habe jetzt einen Test mit Spring Boot + JUnit 5 geschrieben
Ich habe nc (netcat) normalerweise mit JAVA gemacht
Ich möchte die Protokollausgabe unter Android vereinfachen