0

StateProcessorStateというクラスがいくつかあります。メソッドStateProcessor.process(State)のテストを書きたいと思います。このメソッドのロジックは非常に単純ですが、多くのログ メッセージが含まれています。

logger.info(state.getSourse().toString());
if (state.getTarget() == Target.A) {
 logger.info(state.getCreationTime());
 service.doSmth(state);
} else {
 logger.info(state.getTagret().getName());
 service.doOtherStff(state);
}

実際のStateインスタンスをprocessメソッドに渡したくありません。このクラスは非常に複雑であり、ビルドに多くのコード行が必要だからです。そこで、Mockito で作成したモック オブジェクトを渡したいと思います。メイン ロジックによると、getTarget() メソッドのみをモックする必要があります。しかし、実行はstate.getTagret().getName()state.getSourse().toString()で NPE で失敗します。しかし、私はこれらすべてのメソッドを嘲笑するという考えは好きではありません! ロギングのみに使用されました。また、ログメッセージを追加するたびにテストを修正したくありません。

ロギングはそこで非常に便利なので、まったく削除したくありません。しかし、ロギングのためだけにメソッドをモックするのは奇妙に見えます。

この問題を解決するにはどうすればよいですか?

4

3 に答える 3

1

DEEPのモックを検討してください。これにより、各メソッド呼び出しがNPEの代わりにモックを返しnull、NPEを防ぎます。

 Foo mock = mock(Foo.class, RETURNS_DEEP_STUBS);
于 2012-04-18T16:03:41.593 に答える
1

あなたが持っているのは、古典的なデメテルの法則違反です。これは、問題を嘲笑するための教科書的なケースです。

別の方法として、オブジェクト全体Stateを 1 つの場所 (「if」ブロックの前など) に記録し、toString() メソッドをオーバーライドして、表示する必要があるすべてを出力することを検討してください。そうすれば、各フィールドを逆参照して各メソッドをモックする必要がなくなります。

于 2012-04-18T16:17:27.317 に答える
0

すべてのロギング呼び出しをif (!test) {}ブロック内に囲み、test 属性を挿入できます。

または、それらをブロックに囲みif (logger.isInfoEnabled()) {}、情報を無効にしてロギングを構成するか、 に対して false を返すモックロガーを挿入することができますisInfoEnabled()

しかし、ロギングはコードの重要な部分です。したがって、本番環境で爆発しないことを本当にテストしたい場合は、本番コードで null をテストするか、これらの属性が null を返さない可能性があることを証明し、null を返さないモックを注入する必要があります。

tagretPS: プロパティの名前とsourseコードを保持するつもりですか?

于 2012-04-18T15:52:33.240 に答える