0

我正在编写一个用于单元测试的包Netbeans IDE。现在我正在将执行语句流打印到System.outwhile 错误语句到System.error. 现在,由于它们是两个不同的流,因此它们的打印顺序不正确。我的意思是他们没有同步打印。我知道flush方法可以立即打印语句,但是在每个这样的语句之后写这个很乏味。如何预先配置流以立即刷新。可能在单元测试的开始?

我想要这个,因为我想利用两种不同的颜色来Netbeans显示两个输出流。

此外,我的方法中的任何错误点和改进建议都非常受欢迎。

4

3 回答 3

2

可能还有另一种可能,所以试一试:

import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

public class SystemOut {
    public static void main(String[] args) {
        System.out.println("Hi");

        final OutputStream newOs = new OutputStream() {
            FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);

            @Override
            public void write(int b) throws IOException {
                this.fdOut.write(b);
            }
        };

        System.setOut(new PrintStream(newOs));
        System.out.println("Hi, again");
    }
}

这个想法是用无缓冲的输出流替换现有的缓冲输出流。

于 2013-05-31T13:20:43.953 回答
2

您不应该自己打印执行流程。不这样做的原因很多:

  • 您不应该打印成功测试的状态。这样做的理由非常有限。您实际上想要从测试中找到错误,而不是做得好的案例。专注于你的问题。
  • 所有用于单元测试的现代框架,例如jUnitTestNG,都为您提供了用于测试结果输出的内置机制。只需花一些时间来学习它们,您的测试就会提供更多信息。
  • 冗余日志记录会减慢您的测试,这很关键,因为它们应该经常启动。
  • 如果您使用Fail fast practice,您将只对一次失败的消息感兴趣。这是一个很好的方法,可以让你更有效地集中注意力。

简而言之,您不会阅读成功日志,因为它们无用。对于失败的测试,您有带有消息传递的标准断言。

于 2013-05-31T13:50:34.620 回答
1

你可以用另一种方法换println()行:flush()

void out(String s) {
  System.out.println(s);
  System.out.flush();
}

无论如何,看看我编写测试的方式:只有信息消息。错误消息由失败的断言隐式写入。

于 2013-05-31T10:43:48.340 回答