35

通常、コードにログ機能が表示されます。

public class A {

    private static final Log LOG = LogFactory.getLog(A.class);

と使用法:

} catch (Exception e) {
    LOG.error(e.getMessage(), e);
    throw e;
}

しかし、そのようなコードの単一の単体テストさえ見たことがありません。

もちろん、例外をスローするテストと例外の種類をテストしますが、ログ情報を確認するためのテストを作成する必要がありますか? ロギングはシステム動作の別の部分であると考える傾向があるため、テストでそれをカバーすることは論理的にやめられます。

それをカバーする必要があると仮定すると、元のコードを変更してモックログを挿入し、「エラー」メソッドが予期されたメッセージで呼び出されたことを確認する必要があります。しかし、元のクラスがサービスであり、それが春によってインスタンス化されている場合はどうすればよいですか? ロガーや他の依存関係を注入する必要がありますか?

4

6 に答える 6

18

ロギングライブラリをテストするのはあなた次第ではありません。ただし、例外がスローされたときに、クラスが適切なレベルでメッセージをログに記録することをテストすることは価値があります。あなたがテストしているのは、あなたのコードがロギングライブラリで正しいことをするということです。

上記のコードをテスト可能にするには、依存性注入を使用します。これは、ロガーがインターフェースを実装していることを前提としていますILog。ロガーをコンストラクターパラメーターとしてクラスAに渡します。次に、テストコードは、のモック実装を作成し、ILogそれをコンストラクターに渡します。上記のコードには例外が発生する方法は示されていませんが、おそらく他の依存オブジェクトを介して発生します。したがって、それもモックして、例外をスローさせます。次に、モックがメソッドILogを呼び出したことを確認しerrorます。ログに記録されるメッセージを調べたいと思うかもしれませんが、テストコードを脆弱にすることで、それは行き過ぎかもしれません。

于 2012-08-17T01:51:10.323 に答える
0

私は、信頼できるライブラリを呼び出すだけのコードを単体テストしません。
ロギング ライブラリを信頼していますか? テストが失敗した場合、それはライブラリにバグがあるためですか、それとも単にライブラリを正しく構成していないためですか? 構成のテストを気にしますか?

于 2012-08-17T01:36:50.137 に答える