2009-05-18 35 views
73

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

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

回答

44

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

  1. 不要配置log4j;使用默认配置。
  2. 允许log4j在测试期间扫描类路径以获取log4j配置文件。
  3. 自己手动指定配置文件的路径并覆盖类路径搜索。您可以直接通过以下参数java指定配置文件的位置:

    -Dlog4j.configuration=<path to properties file>

    在你的测试运行配置

另请参阅online documentation

+0

它怎么会知道这是一个“log4j配置文件?”什么是文件名? (log4j.xml?) – Chad 2013-08-24 02:37:44

+1

@Chad:我编辑了我的答案来解决你的问题。请参阅静态块的链接,以确切了解它如何实现。 – 2013-08-29 04:15:54

+0

我正在使用log4j2,我必须使用以下设置来指示文件:'-Dlog4j.configurationFile = log4j2.xml'。另外,如果您尝试调试加载/启动,则此设置很有用:'-Dlog4j2.debug = true'。 – Kent 2017-11-02 00:40:14

6

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

52

我通常只是把一个log4j.xml文件放到src/test/resources中,让log4j自己找到它:不需要代码,默认的log4j初始化会自动找到它。 (我通常要设置我自己的记录器“DEBUG”反正)

+5

对于标准建筑物测试,我会将Log4j设置为警告或者甚至是错误。如果测试成功(也是负面测试),则不应该有日志记录,这会引起用户的注意。 – keiki 2012-11-21 13:15:58

4

我的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> 
相关问题