2009-05-18 105 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>