Java - 测试时隐藏系统输出

时间:2015-12-07 20:03:33

标签: java printing junit dependencies project

我不确定是否有可能,但如果可以,我该怎么做?我有一个项目,其中包含另外两个项目作为依赖项。父项目仅用于测试目的(客户端服务器应用程序)。当我测试时,由于客户端和服务器项目具有大量输出,因此难以读取测试输出。我试图找到一种方法从控制台隐藏我的子项目的所有输出(printf()),以便我只能看到我的测试输出。有办法吗?

测试我正在使用JUnit。

由于

3 个答案:

答案 0 :(得分:2)

您应该使用Java Logger API(或Log4J)而不是直接使用System.out.print,您可以在测试执行期间禁用特定的记录器。

如果您无法更改旧代码以使用Logger API,则有两种选择:

选项1:

创建一个类似于这个伪代码的PrintStream装饰器类:

public class FilteredPrintStream extends PrintStream {

    private final PrintStream stream;

    ...

    @Override
    public void print(String str) {
        if (notCalledBySubproject()) {
            stream.print(str);
        }
    }

    // override other methods too
}

然后设置默认输出:System.setOut(new FilteredPrintStream(System.out));

要查找方法调用方(创建notCalledBySubproject方法),请参阅How do I find the caller of a method using stacktrace or reflection?

选项2:

在测试代码中使用Logger API,因此您可以将输出重定向到文件,例如,然后忽略控制台输出并查看测试生成的文件。

答案 1 :(得分:0)

这不是一个完美的解决方案,也不是一个好的编码实践,但你可以添加一个这样的类

public class SystemOutput
{
  public static final boolean DO_PRINT = true;

  public void printf(String format, Object... args)
  {
     if(DO_PRINT)
       System.printf(format, args);
  }
}

并使用查找和替换一次来替换" System.out.printf"使用" SystemOutput.printf"在每个班级都需要。因为两种方法都具有相同的声明,所以只需要更改它。如果要阻止输出,只需将DO_PRINT设置为false

例如,Eclipse提供了一个搜索工具,可以在项目的每个.java文件中查找和替换某个字符串。 (文件搜索选项卡下的Strg + H)

当然也可以使用您自己的System.setOut()子类调用PrintStream,它会覆盖printf()方法,仅在某个布尔值为true时才会打印

答案 2 :(得分:0)

为什么需要控制台来运行单元测试?忽略它。如果您的测试通过,您将获得0状态代码或绿色条(IDE或jenkins)。您可以在例如任何错误堆栈跟踪中找到maven日志测试结果。只是忽略标准输出

另一件事:在你的应用程序中使用控制台通常是个坏主意 - 避免它。改为使用日志框架(它将允许您控制日志记录的目标和级别)。使用您的IDE和重构 - 用log.debug或您自己的包装器替换对printf的所有调用。如果你的IDE不支持它,那么使用一些正则表达式并尝试替换所有

如果要删除所有输出,可以将stdout重定向到/ dev / null或更改java中的输出流。但这不是一个合适的解决方案