我不确定是否有可能,但如果可以,我该怎么做?我有一个项目,其中包含另外两个项目作为依赖项。父项目仅用于测试目的(客户端服务器应用程序)。当我测试时,由于客户端和服务器项目具有大量输出,因此难以读取测试输出。我试图找到一种方法从控制台隐藏我的子项目的所有输出(printf()
),以便我只能看到我的测试输出。有办法吗?
测试我正在使用JUnit。
由于
答案 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
。
当然也可以使用您自己的System.setOut()
子类调用PrintStream
,它会覆盖printf()
方法,仅在某个布尔值为true
时才会打印
答案 2 :(得分:0)
为什么需要控制台来运行单元测试?忽略它。如果您的测试通过,您将获得0状态代码或绿色条(IDE或jenkins)。您可以在例如任何错误堆栈跟踪中找到maven日志测试结果。只是忽略标准输出
另一件事:在你的应用程序中使用控制台通常是个坏主意 - 避免它。改为使用日志框架(它将允许您控制日志记录的目标和级别)。使用您的IDE和重构 - 用log.debug或您自己的包装器替换对printf的所有调用。如果你的IDE不支持它,那么使用一些正则表达式并尝试替换所有
如果要删除所有输出,可以将stdout重定向到/ dev / null或更改java中的输出流。但这不是一个合适的解决方案