【问题标题】:Where do I configure log4j in a JUnit test class?我在哪里可以在 JUnit 测试类中配置 log4j?
【发布时间】:2010-10-27 01:46:23
【问题描述】:

查看我编写的最后一个 JUnit 测试用例,我在类构造函数中调用了 log4j 的 BasicConfigurator.configure() 方法。这对于运行 Eclipse 的“作为 JUnit 测试用例运行”命令中的单个类来说效果很好。但我意识到这是不正确的:我很确定我们的主测试套件从一个进程运行所有这些类,因此 log4j 配置应该发生在更高的某个地方。

但有时我仍然需要自己运行一个测试用例,在这种情况下我希望配置 log4j。我应该将配置调用放在哪里,以便它在测试用例独立运行时运行,而不是在测试用例作为更大套件的一部分运行时运行?

【问题讨论】:

  • 我在这里假设 log4j 1.x,而不是 2...

标签: java logging junit log4j


【解决方案1】:

LogManager 类确定在加载类时运行的static block 中使用哪个 log4j 配置。共有三种供最终用户使用的选项:

  1. 如果将log4j.defaultInitOverride 指定为false,则根本不会配置log4j。
  2. 自己手动指定配置文件的路径并覆盖类路径搜索。您可以使用java 的以下参数直接指定配置文件的位置:

    -Dlog4j.configuration=<path to properties file>

    在您的测试运行器配置中。

  3. 允许 log4j 在测试期间扫描类路径以查找 log4j 配置文件。 (默认)

另请参阅online documentation

【讨论】:

  • 它如何知道它是一个“log4j 配置文件”?文件名是什么? (log4j.xml?)
  • @Chad:我已经编辑了我的答案来解决你的问题。请查看静态块的链接以了解其具体实现方式。
  • 我正在使用 log4j2,我必须使用以下设置来指示文件:-Dlog4j.configurationFile=log4j2.xml。此外,如果您尝试调试加载/启动,此设置可能很有用:-Dlog4j2.debug=true
  • 有什么方法可以更具体地回答这个问题吗?
【解决方案2】:

我在 log4j.xml 中使用系统属性:

...
<param name="File" value="${catalina.home}/logs/root.log"/>
...

并开始测试:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
        <systemProperties>
            <property>
                <name>catalina.home</name>
                <value>${project.build.directory}</value>
            </property>
        </systemProperties>
    </configuration>
</plugin>

【讨论】:

    【解决方案3】:

    我一般只是把 log4j.xml 文件放到 src/test/resources 让 log4j 自己找到:不需要代码,默认的 log4j 初始化会捡起它。 (我通常想将自己的记录器设置为“调试”)

    【讨论】:

    • 对于标准建筑测试,我会将 Log4j 设置为警告甚至错误。如果测试成功(也是负面测试),则不应记录日志,这会引起用户的注意。
    • 是的,这对 log4j 1.x 是正确的。对于 log4j2 显然您可以使用更多“外来”文件,例如 log4j2-test.properties 文件...logging.apache.org/log4j/2.x/manual/configuration.html :)
    • 你确定 log4j-test.properties 吗?关于配置将查找的位置层次结构的文档不是很清楚
    【解决方案4】:

    您可能想查看Simple Logging Facade for Java (SLF4J)。它是一个围绕 Log4j 的外观,不需要像 Log4j 这样的初始设置调用。为 Slf4j 切换 Log4j 也相当容易,因为 API 差异很小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      相关资源
      最近更新 更多