4

他のプログラマーが作成したプログラムで JUnit + JMock を実行するタスクを与えました。ほとんどのクラスには、次の静的フィールド ロガーがあります。

static Log logger = LogFactory.getLog(SomeClass.class.getName());

メソッド内でインスタンス化することにより、 SomeClassのインスタンスを作成していますsetUp()。jUnit クラスを実行すると、次のエラー メッセージが表示されます。

log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException:  (No such file or directory)

DOMConfigurator.configure("log4j.xml");メソッド内で呼び出して手動で log4j を設定しようとしましたが、setUp()上記と同じエラー メッセージが表示されます。

質問は:

  • LogFactory.getLogを使用する他のクラスを呼び出すクラスで単体テスト + モッキングを実行するにはどうすればよいですか
  • モックと単体テストが例外なく実行されるように、setup メソッド内で log4j を構成する必要がありますか?
  • どうすればいいですか。
4

2 に答える 2

4

選択肢は 2 つあります...

Maven プロジェクトでは、test/resources フォルダーに log4j.properties を作成するだけでよいため、2 番目のオプションは簡単です。

于 2012-01-23T19:11:55.897 に答える
2

実際、私が抱えている問題には 2 種類ありますが、そのうちの 1 つは jUnit の log4j の問題です。log4j が適切に構成されていなくても、実際には jUnit + jMock を続行できます。例外はスローされますが、jUnit の実行は停止しません。

私が抱えている問題は次のとおり
です。 1. FileNotFoundException 例外とメッセージ「setFile(null, true) call failed」
2. jMock の予期しない呼び出しエラー

VM引数を配置することで、1番の問題を解決しました(log4j例外があっても単体テストを続行できましたが)-Dlog4j.configuration=file:/C:/log4j/log4j.xml。コンパイルされたディレクトリ(コンパイルされたJavaクラスのデフォルトの出力フォルダー)内でlog4j.xmlを使用していたため、例外が発生していました。log4j にはこのパラメータがあります<param name="File" value="${error.file}"/>そのため、log4j はファイル名が${error.file} (存在しない)のログ ファイルを探しています。上で言ったように、VM引数を上に置くことで解決しました。

得られた教訓: log4j の実行で FileNotFoundException が発生した場合は-Dlog4j.debug、VM 引数として配置して、log4j が構成ファイルをプルしている場所を確認してください。

テスト中のメソッド内で予想されるすべてのオブジェクトを完成させることで、番号 2 を解決します。jMock メッセージはちょっとあいまいですが。

教訓: 通常、予期しない呼び出しは、単体テストを行っているメソッドで使用されているオブジェクトまたはモック オブジェクトがテスト メソッドにないことを意味します。また、呼び出そうとしているオブジェクトに期待を設定していないことも意味します

于 2012-01-24T19:06:02.857 に答える