在另一个线程中重定向stdout

时间:2013-05-05 02:00:53

标签: scala redirect stdout

我正在尝试编写一个将重定向main方法的stdout的测试,但似乎一旦我调用main,它似乎从另一个线程开始,我无法捕获输出。这是代码:

这有效:

val baos = new ByteArrayOutputStream
val ps = new PrintStream(baos)
System.setOut(ps)
print("123")
Assert.assertEquals("123", baos.toString)

这不是:

val baos = new ByteArrayOutputStream
val ps = new PrintStream(baos)
System.setOut(ps)
GameRunner.main(_)
Assert.assertEquals("123", baos.toString)

...

object GameRunner {
    def main(args: Array[String]) {
        print("123")

如何在测试中接听print的电话?

*我也试过scala.Console.setOut

修改

我注意到当我没有重定向时,运行GameRunner.main(_)甚至没有在控制台中列出任何内容。造成这种情况的原因是什么?

1 个答案:

答案 0 :(得分:2)

print真是Predef.print,会调用Console.print。即使您致电System.setOut,我也不知道这是否会对Console.print产生影响。尝试拨打Console.setOut或尝试:

Console.withOut(ps)(GameRunner.main(null))

另一种可能性是通过调用GameRunner.main(_)你没有执行任何操作(因为它可能只是返回函数(args: Array[String]) => GameRunner.main(args)?。应该快速排除它。

编辑是的:

scala> object A { def main(args: Array[String]) { println("1") } }
defined module A   
scala> A.main(null)
1
scala> A.main(_)
res1: Array[String] => Unit = <function1>