[解決済み】Loggerのメッセージに対してJUnitアサートを行う方法
質問
私は、その状態を報告するためにJavaロガーを呼び出すいくつかのテスト中のコードを持っています。 JUnitテストコードでは、このロガーに正しいログエントリが作成されたことを確認したいと思います。次のようなものです。
methodUnderTest(bool x){
if(x)
logger.info("x happened")
}
@Test tester(){
// perhaps setup a logger first.
methodUnderTest(true);
assertXXXXXX(loggedLevel(),Level.INFO);
}
特別に適合させたロガー(またはハンドラ、フォーマッタ)を使えば可能だと思いますが、すでに存在するソリューションを再利用することを希望します。(そして、正直なところ、loggerからlogRecordを取得する方法は私には明確ではありませんが、それが可能であるとします)。
どのように解決するのか?
これらの(驚くほど)迅速かつ有用な回答をどうもありがとうございました。
私がこれを使いたいコードベースは、そのロガーメカニズムとしてjava.util.loggingを使います。そして、私は、log4jまたはロガーインターフェース/facadesにそれを完全に変更するためにそれらのコードで十分にくつろいだ感じがしません。 しかし、これらの提案に基づいて、私は、j.u.l.handler拡張を'ハックアップ'しました。
簡単にまとめると以下のようになります。拡張
java.util.logging.Handler
:
class LogHandler extends Handler
{
Level lastLevel = Level.FINEST;
public Level checkLevel() {
return lastLevel;
}
public void publish(LogRecord record) {
lastLevel = record.getLevel();
}
public void close(){}
public void flush(){}
}
明らかに、あなたが好き/好き/必要なものを好きなだけ
LogRecord
または、オーバーフローが発生するまで、すべてをスタックにプッシュします。
junit-testの準備では、まず最初に、(1)で作成した
java.util.logging.Logger
を追加し、そのような新しい
LogHandler
を追加しました。
@Test tester() {
Logger logger = Logger.getLogger("my junit-test logger");
LogHandler handler = new LogHandler();
handler.setLevel(Level.ALL);
logger.setUseParentHandlers(false);
logger.addHandler(handler);
logger.setLevel(Level.ALL);
の呼び出しは
setUseParentHandlers()
は、通常のハンドラを黙らせることで、(この junit-test の実行では)不要なログを記録しないようにするためです。 テスト中のコードがこのロガーを使用する必要がある場合は、 テストを実行し、assertEquality を実行してください。
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(もちろん、この作業の大部分を
@Before
メソッドで、その他にもさまざまな改良を加えていますが、それではこのプレゼンテーションの意味がありません)。
関連
-
[解決済み] java.lang.ClassCastException: java.util.Arrays$ArrayList は java.util.ArrayList にキャストできません。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] Pythonの "assert "はどのように使うのですか?
-
[解決済み] 例外がスローされたことを確認するためにAssertを使用するにはどうすればよいですか?
-
[解決済み] なぜJUnitはassertNotEqualsメソッドを提供しないのですか?
-
[解決済み】2つのJUnit Assertクラスの相違点
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] getContentPane()は具体的に何をするのですか?
-
[解決済み] JavaでFileFilterを作るには?
-
[解決済み] android.support.v4.app.FragmentActivity' で 'TAG' がプライベートアクセスされている。
-
[解決済み] Java UnknownFormatConversionException
-
[解決済み] mavenのコンパイルに失敗するのはなぜですか?
-
[解決済み] JavaにおけるMouseListenerとMouseAdapterの違いについて
-
[解決済み] Java の文字列インデックスが範囲外です。0 [閉店]
-
[解決済み] SubclipseとJavaHLのインストールで頭を悩ます
-
[解決済み] タイプの安全性。アンチェック・キャスト
-
[解決済み] Mockito : メソッド内で生成されたオブジェクトでメソッドが呼び出されたことを確認する方法?