[Java] Je souhaite tester l'entrée standard et la sortie standard avec JUnit

Déclencheur

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.

environnement

Articles référencés

Qiita - Entrée standard Push dans JUnit Kenkoba's Diary-Stealing Standard I / O Blog Nyoki Nyoki - Remplaçons System.out

Aperçu

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.

la mise en oeuvre

Créez une classe d'entrée et une classe de sortie.

Classe d'entrée --StandardInputStream

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;
    }
}

Classe de sortie --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());
    }

    /**
     *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);
        }
    }
}

Code à tester

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);
        }
    }
}

Code de test

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.

en conclusion

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

[Java] Je souhaite tester l'entrée standard et la sortie standard avec JUnit
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
[Java] Comment tester s'il est nul dans JUnit
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (édition PowerMockito)
Je veux faire des transitions d'écran avec kotlin et java!
Même en Java, je veux sortir true avec un == 1 && a == 2 && a == 3 (deuxième décoction Javassist)
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (Black Magic)
(´-`) .. oO (Je veux trouver facilement la sortie standard" Hello ".
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
J'ai essayé d'interagir avec Java
[Java] Tester des méthodes privées avec JUnit
Je veux implémenter diverses fonctions avec kotlin et java!
Je veux renvoyer un type différent de l'élément d'entrée avec Java8 StreamAPI Reduce ()
Je veux revenir à l'écran précédent avec kotlin et java!
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Je souhaite utiliser DBViewer avec Eclipse 2018-12! !!
Je veux écrire un test unitaire!
Présentation du test Java automatisé avec JUnit 5 + Gradle
[Java] Colorez la sortie standard vers le terminal
Je veux afficher des images avec REST Controller de Java et Spring!
[Java] Je veux faciliter les choses car il est difficile d'entrer System.out.println
Écrivons l'entrée / sortie de fichier Java avec NIO
[CircleCI 2.0] [Java] [Maven] [JUnit] Agréger les résultats des tests JUnit avec CircleCI 2.0
Exécuter R à partir de Java Je veux exécuter rJava
J'ai essayé de faire une authentification de base avec Java
Je souhaite envoyer un e-mail en Java.
Comment tester les interruptions pendant Thread.sleep avec JUnit
rsync4j --Je veux toucher rsync en Java.
Je veux jouer avec Firestore de Rails
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
Je veux écrire rapidement de java vers sqlite
J'ai essayé de casser le bloc avec java (1)
Je souhaite effectuer un traitement d'agrégation avec spring-batch
[Rails] Je veux charger du CSS avec webpacker
[Rails] Je veux tester avec RSpec. Nous soutenons votre démarche [Procédure d'introduction]
J'ai essayé le type d'entrée / sortie de Java Lambda ~ édition POJO ~
Je veux faire quelque chose comme "cls" en Java
[Java] Je souhaite calculer la différence par rapport à la date
J'ai essayé de lire et de sortir CSV avec Outsystems
J'ai essayé d'implémenter TCP / IP + BIO avec JAVA
[Java 11] J'ai essayé d'exécuter Java sans compiler avec javac
Comment entrer / sortir des fichiers mainframe IBM en Java?
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
[Java] Comment chiffrer avec le chiffrement AES avec une bibliothèque standard
J'ai essayé le type d'entrée / sortie de Java Lambda ~ Stream version ~
Je souhaite utiliser le mode sombre avec l'application SWT
Je souhaite surveiller un fichier spécifique avec WatchService
Je souhaite authentifier les utilisateurs auprès de Rails avec Devise + OmniAuth
Comment sortir le standard d'un tableau avec for Each
J'ai essayé d'implémenter Sterling Sort avec Java Collector
récapitulatif des entrées / sorties standard de vérification des compétences paiza [édition Java]
J'ai écrit un test avec Spring Boot + JUnit 5 maintenant
J'avais l'habitude de faire nc (netcat) avec JAVA normalement
Je souhaite simplifier la sortie du journal sur Android