Test main class input method with Systemin snapping in test class

1

How do I test the System.out.println () method? The method I want to test displays the phrase:

  

Enter the name >

How do I test if this sentence was changed or not changed in the Test class?

Main class:

public class Cliente extends PessoaFisica {  

protected static Cliente pegarDados() {  
        String nome, estado, cidade;  
        int cpf, telefone, numeroConvenio;  

        System.out.println("Informe o nome");  
        nome = Clinica.entrada.nextLine();  

        System.out.println("Informe CPF");  
        cpf = Clinica.readInt();  

        System.out.println("Informe telefone");  
        telefone = Clinica.readInt();  

        System.out.println("Informe o estado");  
        estado = Clinica.entrada.nextLine();  

        System.out.println("Informe a cidade");  
        cidade = Clinica.entrada.nextLine();  

        System.out.println("Informe o número do do convênio");  
        numeroConvenio = Clinica.readInt();  

        Cliente cliente = new Cliente(nome, cpf, telefone, estado, cidade, numeroConvenio);  

        return cliente;  
    }  

test class

import java.io.ByteArrayInputStream;
import org.junit.Assert;
import org.junit.Test;

public class ClienteTest {  

public void pegarDadosTest() {  
        String nome = "André Nascimento";  
        ByteArrayInputStream entradaTest = new ByteArrayInputStream(  
                nome.getBytes());  

        System.setIn(entradaTest);  

        String esperado = "Informe nome" + System.getProperty("line.separator");  

        Cliente.pegarDados();  

        String atual = entradaTest.toString();  

        Assert.assertEquals("metodo pegarDados falhou.", esperado, atual);  
    }  
    
asked by anonymous 07.04.2016 / 15:35

1 answer

0

Stopping test System.out.println , you can create a OutputStream and pass it to the System.setOut method. That way, when System.out.println is called, the output will be written to its OutpuStream and you will be able to access that output later. However, in your case, you can not test each call individually. Your method is one, so you would have to test the entire output.

Example:

public class PegarDadosTest {

    private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();

    //Aqui você está adicionando o seu outputStream como saída padrão. Quando o comando
    //System.out.println for chamado, o conteúdo será escrito na variável outContent.
    //Dessa forma, você poderá verificar o que está sendo escrito no out.
    @Before
    public void setup() {
        System.setOut(new PrintStream(outContent));
        // Você também pode passar o seu InputStream para o System. Dessa forma, você não precisa inputar dados
        // no console.
        InputStream inputStram = new ByteArrayInputStream(getInput().getBytes());
        System.setIn(inputStram);
    }

    @After
    public void tearDown() throws IOException {
        outContent.close();
        System.setOut(null);
        System.setIn(null);
    }

    //Testa se as mensagens impressas pelo método estão corretas
    @Test
    public void pegarDadosTest() {
        Cliente.pegarDados();
        Assert.assertEquals(getExpected(), outContent.toString());
    }

    private String getInput() {
        StringBuilder builder = new StringBuilder();
        builder.append("João\n");
        builder.append("123\n");
        builder.append("456\n");
        builder.append("Estado\n");
        builder.append("Cidade\n");
        builder.append("1");
        return builder.toString();
    }

    private String getExpected() {
        StringBuilder builder = new StringBuilder();
        builder.append("Informe o nome\n");
        builder.append("Informe CPF\n");
        builder.append("Informe telefone\n");
        builder.append("Informe o estado\n");
        builder.append("Informe a cidade\n");
        builder.append("Informe o número do do convênio\n");
        return builder.toString();
    }
}

However, as already mentioned in the comments of your question. This test of yours is not necessary. What you have to test is the return of your method and not what it is doing in between. In this case, what you could test is whether the returned Client object is expected. Checking System.out.println is useful when the method is void and it prints some messages on the console when executed successfully or when it gives some error.

A more interesting test would be this:

//Testa se o cliente foi montado corretamente
    @Test
    public void pegarDadosClientTest() {
        Cliente atual = Cliente.pegarDados();
        Cliente expected = getClienteExpected();
        Assert.assertEquals(expected.getNome(), atual.getNome());
        Assert.assertEquals(expected.getCpf(), atual.getCpf());
        Assert.assertEquals(expected.getTelefone(), atual.getTelefone());
        Assert.assertEquals(expected.getEstado(), atual.getEstado());
        Assert.assertEquals(expected.getCidade(), atual.getCidade());
        Assert.assertEquals(expected.getNumeroConvenio(), atual.getNumeroConvenio());
    }

    private Cliente getClienteExpected() {
        Cliente cliente = new Cliente("João", 123, 456, "Estado", "Cidade", 1);
        return cliente;
    }

This code snippet you can use within the class of the previous code.

    
29.11.2017 / 02:37