2011-11-25 27 views
6

私はロガーメンバーを持っているスプリングビーンを持っています。私はそのロガーを使っていくつかのアクションを記録します。
また、SpringJUnit4ClassRunnerを使用するテストケースを作成しました。私は、プロパティファイルでのLog4jを設定していると、各テストケースには、私はこれらの性質を持つロガー初期化:私は、テストを実行するとJUnitのLog4jテストケース

@BeforeClass 
public static void init() { 
    PropertyConfigurator.configure("src/com/config/log4j.properties"); 
} 

それは、

log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

しかし私の中にロガーを警告を与えるを私のbeanは、log4j.properties内の指定された場所にメッセージを書き込みます。つまり、正常に動作します。 なぜlog4jが私にそのような警告を出すのですか?

+0

「-Dlog4j.configuration = com/config/log4j.properties」をJVMに渡すことができます。あなたが言及したコードは削除することができます。 –

答えて

5

私はあなたが、@DNは自分のアプリケーションのクラスパスにlog4j.propertiesファイルを追加提案としてだけで行う、log4jのに関する警告が表示したくない場合は理由がSpringJUnit4ClassRunner

public SpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError { 
    super(clazz); 
    if (logger.isDebugEnabled()) { 
     logger.debug("SpringJUnit4ClassRunner constructor called with [" + clazz + "]."); 
    } 
    this.testContextManager = createTestContextManager(clazz); 
} 

でこのコードだと思います大文字と小文字の区別がない場合は、log4j.propertiesファイルを(src/main/resources)に追加してください。

2

RunnerはLog4Jが初期化される前に実行を実行するためです。

+0

SpringJUnit4ClassRunnerにはLog4jが必要ですか?はいの場合は、ランナの実行前にどうすれば設定できますか? – maks

+0

@maks必要な場合、またはログラッパーを使用するかどうかは不明です。 classpathルートに 'log4j.properties'を置くだけで十分ですが、試してみる必要があります。 –

+0

@maks Commonsログは実際にはログに記録されますが、アドバイスはそのまま適用されます。 –

11

私はlog4jの設定をデフォルトのクラスパスから外して、ユニットテスト&の生産と異なるロギングを使用したいと思っていました。私は、SpringJUnit4ClassRunnerをサブクラス化し、静的クラスの初期化子を使用することでその問題を解決しました。

// The new test runner 
public class JUnit4ClassRunner extends SpringJUnit4ClassRunner { 

    static { 
    try { 
     Log4jConfigurer.initLogging("classpath:test/log4jconfig.xml"); 
    } 
    catch(FileNotFoundException ex) { 
     System.err.println("Cannot Initialize log4j"); 
    } 
    } 

    public JUnit4ClassRunner(Class<?> clazz) throws InitializationError { 
    super(clazz); 
    } 
} 

テストに変更します。

@RunWith(JUnit4ClassRunner.class) 
@ContextConfiguration 
@TransactionConfiguration 
@Transactional 
public class LmpDaoImplTest extends AbstractTransactionalJUnit4SpringContextTests { 
... 

今のlog4jは、春のテストランナーが呼び出される前に設定されています。

+0

あなたはこれをあなたのパッケージ構造にどこに置いていますか? –

+0

私はこれを別のプロジェクトに保存しています(別のjarファイルになります)。このようにして、プロジェクト間でテストランナークラスを再利用できます。したがって、特定のパッケージは、テストクラスのクラスパス内になければならない点を除いて、無関係です。 – wbdarby

関連する問題