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