web-dev-qa-db-ja.com

JUnitテストクラスでlog4jを構成する場所

最後に書いたJUnitテストケースを見て、クラスコンストラクター内でlog4jのBasicConfigurator.configure()メソッドを呼び出しました。これは、Eclipseの「run as JUnit test case」コマンドからその単一のクラスだけを実行するのにうまく機能しました。しかし、私はそれが間違っていることを認識しています。メインのテストスイートはこれらのクラスをすべて1つのプロセスから実行するので、log4jの設定はどこか上で行われるはずです。

ただし、テストケースを何度か実行する必要があり、その場合はlog4jを構成する必要があります。テストケースがスタンドアロンで実行されるときに実行されるように構成呼び出しを配置する必要がありますが、テストケースがより大きなスイートの一部として実行されるときは実行されませんか?

82
skiphoppy

LogManagerクラスは、クラスのロード時に実行される 静的ブロック で使用するlog4j構成を決定します。エンドユーザー向けの3つのオプションがあります。

  1. log4j.defaultInitOverrideをfalseに指定すると、log4jはまったく構成されません。
  2. 構成ファイルへのパスを自分で手動で指定し、クラスパス検索をオーバーライドします。 Javaに次の引数を使用して、構成ファイルの場所を直接指定できます。

    -Dlog4j.configuration=<path to properties file>

    テストランナー構成で。

  3. テスト中にlog4jがlog4j構成ファイルのクラスパスをスキャンできるようにします。 (デフォルト)

オンラインドキュメント も参照してください。

49
Paul Morie

私は通常、log4j.xmlファイルをsrc/test/resourcesに配置し、log4jがそれを単独で検出できるようにします。コードは不要で、デフォルトのlog4j初期化がそれを選択します。 (通常、とにかく自分のロガーを「デバッグ」に設定したい)

58
araqnid

Java(SLF4J) のシンプルロギングファサードを参照してください。これはラップアラウンドするファサードです。 Log4jのような初期セットアップコールを必要としないLog4j APIの違いが最小限であるため、Log4jをSlf4jに切り替えるのもかなり簡単です。

6
James McMahon

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>
5
gavenkoa