Récemment, j'ai commencé à étudier la programmation compétitive. Il est difficile de saisir à chaque fois lors de la vérification du fonctionnement localement. Je veux le faire avec JUnit.
Qiita - Entrée standard Push dans JUnit Kenkoba's Diary-Stealing Standard I / O Blog Nyoki Nyoki - Remplaçons System.out
Vous pouvez changer la destination de sortie et la destination d'entrée de la sortie et de l'entrée standard avec setOut
et setIn
de la classe System
.
Vous pouvez définir et définir une classe qui hérite de PrintStream
pour Out et de ʻInputStream` pour In.
Créez une classe d'entrée et une classe de sortie.
StandardInputStream.java
import java.io.InputStream;
public class StandardInputStream extends InputStream {
private StringBuilder sb = new StringBuilder();
private String lf = System.getProperty("line.separator");
/**
*Saisissez une chaîne de caractères. Les sauts de ligne se font automatiquement
* @param str chaîne d'entrée
*/
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());
}
/**
*Lire une ligne de chaîne de caractères
* @return Caractères qui ne contiennent pas de sauts de ligne. Null pour résiliation
*/
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);
}
}
}
Le code à tester est emprunté à atcoder. PracticeA - Welcome to AtCoder
** Problème ** Compte tenu des entiers a, b, c et de la chaîne s. Afficher le résultat du calcul de a + b + c et la chaîne de caractères s côte à côte.
** Entrée **
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 en commutant entrée / sortie avant le traitement préalable.
Il est facile d'écrire des cas de test, donc je pense que c'est plus facile à implémenter. Non limité à cela, j'ai décidé d'écrire le test correctement. Je veux étudier le TDD. ~~ JUnit je l'ai touché après un long moment ~~
Recommended Posts