Java: prueba de salida del sistema que incluye "nuevas líneas" con afirmar

Además de las otras respuestas si está buscando una forma independiente de la plataforma ...

Una solución rápida independiente de la plataforma puede ser reemplazar los separadores de línea

String expected = "Quack\nI'm flying!!\nI can't fly\nI'm flying with a rocket"
                       .replaceAll("\\n|\\r\\n", System.getProperty("line.separator"));
assertEquals(expected, outContent.toString().trim());

o usando a PrintWriterpara construir la cadena esperada.

StringWriter expectedStringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(expectedStringWriter);

printWriter.println("Quack");
printWriter.println("I'm flying!!");
printWriter.println("I can't fly");
printWriter.println("I'm flying with a rocket");
printWriter.close();

String expected = expectedStringWriter.toString();
assertEquals(expected, outContent.toString());

o crear una propia clase de aserción para reutilizarla

class MyAssert {

    public static void assertLinesEqual(String expectedString, String actualString){
        BufferedReader expectedLinesReader = new BufferedReader(new StringReader(expectedString));
        BufferedReader actualLinesReader = new BufferedReader(new StringReader(actualString));

        try {
            int lineNumber = 0;

            String actualLine;
            while((actualLine = actualLinesReader.readLine()) != null){
                String expectedLine = expectedLinesReader.readLine();
                Assert.assertEquals("Line " + lineNumber, expectedLine, actualLine);
                lineNumber++;
            }

            if(expectedLinesReader.readLine() != null){
                Assert.fail("Actual string does not contain all expected lines");
            }
        } catch (IOException e) {
            Assert.fail(e.getMessage());
        } finally {
            try {
                expectedLinesReader.close();
            } catch (IOException e) {
                Assert.fail(e.getMessage());
            }
            try {
                actualLinesReader.close();
            } catch (IOException e) {
                Assert.fail(e.getMessage());
            }
        }
    }
}

Entonces puede dar una mejor descripción del problema si la prueba falla. P.ej

MyAssert.assertLinesEqual(
         "Quack\nI'm flying!!\nI can not fly\nI'm flying with a rocket\n",
         outContent.toString());

saldrá

org.junit.ComparisonFailure: Line 2 
Expected :I can not fly
Actual   :I can't fly
Respuesta 1

Hasta ahora, todas las otras respuestas son técnicamente correctas; pero aún así no mencionan una cosa central: es simplemente una mala práctica capturar stdout / stderr y luego hacer una coincidencia de cadena exacta; suponiendo que tu clase escriba allí.

Aún más cuando está probando llamadas a múltiples métodos, y espera que algún resultado final "pruebe" que todos los métodos fueron llamados, y así sucesivamente.

Entonces, sí, teóricamente puedes hacer las cosas de esta manera (con fines de capacitación / aprendizaje); pero el "patrón" que está usando aquí simplemente se dice "mala práctica". Qué sucede cuando más tarde decide eliminar esas declaraciones impresas (porque, bueno, el código de producción no hace declaraciones impresas). Entonces todas tus pruebas se vuelven inútiles. ¿O cuando algún otro usuario cambia un carácter en las cadenas que van a stdout?

Por lo tanto: la verdadera respuesta es dar un paso atrás y considerar cuáles podrían ser los verdaderos "efectos secundarios" que causarán estas llamadas a métodos; y busca mejores formas de verificarlos.

Respuesta: 2

Intente usar \ r \ n en lugar de \ n.

assertEquals("Quack\r\nI'm flying!!\r\nI can't fly\r\nI'm flying with a rocket", outContent.toString().trim());
Respuesta: 3

Estoy usando el registro de commons en una aplicación Java, y quiero registrar la excepción del seguimiento de la pila. catch (excepción de excepción) {logger.error ("FailedCreateActivityFunction Exception ...

Estoy jugando con los servicios DNS en Java: estoy tratando específicamente de buscar todas las direcciones de google.com y mostrarlas en una matriz, similar a ejecutar una búsqueda usando nslookup: nslookup -q = TXT ...

Ejecución de pruebas de Nightwatch en CI en Chrome. A veces (aproximadamente una vez en 5 compilaciones) me encuentro con el siguiente error, en una de las pruebas. Cada prueba antes de esta funciona bien. Tengo el último Chromedriver ...

Cuando voy a la estructura de mi proyecto y hago clic derecho -> nuevo, solo veo un nuevo archivo / carpeta, etc., pero no hay generación de clases ni paquetes. ¿Cómo consigo que IntelliJ haga esto? (Tengo Intellij 14 Ultimate - ver ...