Redirect stdout in another thread

我怕爱的太早我们不能终老 提交于 2019-12-23 03:29:14

问题


I am trying to write a test that will redirect the stdout of a main method, but it seems that once I call the main, it seems to start on another thread and I cannot capture the output. Here is the code:

This works:

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

This does not:

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")

How can I catch the call to print in my test?

*I have also tried scala.Console.setOut

EDIT

I do notice that running GameRunner.main(_) does not even list anything in the console when I am not redirecting. What is causing this?


回答1:


print is really Predef.print which calls Console.print. Even though you call System.setOut I don't know if that has an impact on Console.print. Try to call Console.setOut or try:

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

The other possibility is that by calling GameRunner.main(_) you are not executing anything (as may be it's just returning the function (args: Array[String]) => GameRunner.main(args)?. Should be quick to rule that out.

Edit yep:

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>


来源:https://stackoverflow.com/questions/16380699/redirect-stdout-in-another-thread

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!