我在哪里配置JUnit测试类中的log4j?

ski*_*ppy 83 java logging junit log4j

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

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

ara*_*nid 58

我通常只是将一个log4j.xml文件放入src/test/resources中,让log4j自己找到它:不需要代码,默认的log4j初始化将把它拿起来.(我通常想把自己的记录器设置为'DEBUG')

  • 对于标准的建筑测试,我会将Log4j设置为警告甚至错误.如果测试成功(也是否定测试),则应该没有记录,这会引起用户的注意. (6认同)
  • 是的,这适用于 log4j 1.x 。对于 log4j2,显然您可以使用更多“异国情调”文件,例如 log4j2-test.properties 文件... https://logging.apache.org/log4j/2.x/manual/configuration.html :) (2认同)

Pau*_*rie 49

LogManager类确定在使用哪个log4j的配置的静态块被加载的类时运行.最终用户有三种选择:

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

    -Dlog4j.configuration=<path to properties file>

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

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

另请参阅在线文档.


Jam*_*hon 6

您可能希望研究Simple Logging Facade for Java(SLF4J).它是一个包围Log4j的外观,它不需要像Log4j这样的初始设置调用.由于API差异很小,因此为Slf4j切换Log4j也相当容易.


gav*_*koa 5

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

...
<param name="File" value="${catalina.home}/logs/root.log"/>
...
Run Code Online (Sandbox Code Playgroud)

并开始测试:

<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>
Run Code Online (Sandbox Code Playgroud)