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.
Qiita - Standardeingabe in JUnit drücken Kenkobas Standard-E / A für Tagebuchdiebstahl Nyoki Nyoki Blog - Ersetzen wir System.out
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.
Erstellen Sie Eingabe- und Ausgabeklassen.
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;
}
}
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);
}
}
}
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);
}
}
}
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.
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