在单元测试期间,如何将所有输出记录到控制台而不是日志文件

时间:2012-09-28 00:45:01

标签: java apache junit logfactory

最初标题为:如何让Apache LogFactory始终返回相同的日志实现?

我有一个项目,它使用了很多不同的记录器来配置去不同的地方。当我运行单元测试时,我想用一个我自己实例化的SimpleLogger来覆盖它们。如何将其设置为LogFactory,以便始终返回单元测试?

我真的不想处理外部配置文件。

作为一点背景,我发现伐木工人非常不值得信任。它不是真正的记录器,它是有很多方法来配置它并过滤输出 - 它可以从各种配置文件或代码中的任何地方完成,然后它可以到各种位置。记录器甚至可以根据配置将某种输出(错误)发送到其他位置。

虽然这可能非常强大和强大,但是当你花费6个小时想知道为什么你的代码在被调用时被调用但你的输出被重定向时,它们都被撤消了。

运行测试时,我希望尽可能确定我看到所有输出,所以我想将所有日志重定向到控制台。 (所有,就像我目前的项目一样,可以在6个目录中创建几十个不同的日志文件。)

1 个答案:

答案 0 :(得分:1)

我终于想出办法来做到这一点。

您可以使用自己的工厂扩展LogFactory - 覆盖两个getInstance方法以返回您的记录器(显然所有其他方法都可以为空)。我使用SimpleLogger将所有日志记录分配到控制台:

public Log getInstance(String name) throws LogConfigurationException {
    // If this weren't just for testing I'd keep a map of these loggers instead...
    SimpleLog consoleLogger=new SimpleLog(name);
    consoleLogger.setLevel(SimpleLog.LOG_LEVEL_ALL);
    return consoleLogger;
}
public Log getInstance(Class className) throws LogConfigurationException {
    return getInstance(arg0.getName());
}

然后在此类中使用静态方法安装它:

public static void initialize() {
    System.setProperty(LogFactory.FACTORY_PROPERTY, MyLogFactory.class.getName());
}

这将整个日志重新路由器限制在一个类中,如果在测试开始时调用initialize(),则会话的所有日志输出都将重新路由到控制台。请勿在以后调用它,否则您正在测试的代码可能已经调用了“Normal”工厂并缓存了真正的记录器。

相关问题