unit tutorial true test matchers lists flatspec failure exceptions example scala scalatest

true - scalatest tutorial



Scalatest-cómo probar println (3)

¿Hay algo en Scalatest que me permita probar la salida a la salida estándar a través de una declaración de println ?

Hasta ahora he estado usando FunSuite with ShouldMatchers .

Por ejemplo, ¿cómo comprobamos la salida impresa de

object Hi { def hello() { println("hello world") } }


La forma habitual de probar las declaraciones de impresión en la consola es estructurar su programa de manera un poco diferente para que pueda interceptar esas declaraciones. Por ejemplo, puedes introducir un rasgo de Output :

trait Output { def print(s: String) = Console.println(s) } class Hi extends Output { def hello() = print("hello world") }

Y en tus pruebas puedes definir otro rasgo que MockOutput realmente intercepta las llamadas:

trait MockOutput extends Output { var messages: Seq[String] = Seq() override def print(s: String) = messages = messages :+ s } val hi = new Hi with MockOutput hi.hello() hi.messages should contain("hello world")


Puede reemplazar donde escribe println utilizando Console.setOut (PrintStream)

val stream = new java.io.ByteArrayOutputStream() Console.setOut(stream) println("Hello world") Console.err.println(stream.toByteArray) Console.err.println(stream.toString)

Obviamente, puede utilizar cualquier tipo de flujo que desee. Puedes hacer lo mismo para stderr y stdin con

Console.setErr(PrintStream) Console.setIn(PrintStream)


Si solo desea redirigir la salida de la consola por un tiempo limitado, use los métodos withOut y withErr definidos en la Console :

val stream = new java.io.ByteArrayOutputStream() Console.withOut(stream) { //all printlns in this block will be redirected println("Fly me to the moon, let me play among the stars") }