2012-01-23 26 views
4

他のプログラマーが作成したプログラムでJUnit + JMockを実行するタスクを与えました。クラスのほとんどはすなわち、この静的フィールドロガーを持っている:jUnit + jMockとlog4j

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

私は私のsetUp()メソッドの内部で、それをインスタンス化することによって工assのインスタンスを作成しています。私は、このエラーメッセージを取得しています、私のJUnitのクラスを実行すると:

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

は私がsetUp()メソッド内DOMConfigurator.configure("log4j.xml");を呼び出すことにより、手動のlog4jコンフィギュレーションを実行しようとしましたが、私はまだ上記の同じエラーメッセージを取得しています。

質問です:

  • は、どのように私は自分のユニットテストを実行+ LogFactory.getLog
  • を使用して、他のクラスを呼び出すクラスのモックすることができます私は私のセットアップメソッド内のlog4jを設定する必要がありますので、嘲笑と単体テストは例外なく実行されますか?
  • どうすればよいですか?

答えて

1

実際、jUnitのlog4j問題は、私が考えた2つのタイプの問題があります。 log4jが正しく構成されていなくても例外をスローしますが、jUnitの実行を停止することはありませんが、実際にはjUnit + jMockを使用して続行できます。

私がしているしている問題: "setFile(NULL、TRUE)の呼び出しに失敗しました" というメッセージと
1にFileNotFoundException例外
2. jMock予期しない起動エラー

私が解か数1(でも、私ができるけれどもlog4j例外を指定してもユニットテストを続ける)VM引数-Dlog4j.configuration=file:/C:/log4j/log4j.xmlを入れてください。コンパイルされたディレクトリ(コンパイルされたJavaクラスのデフォルトの出力フォルダ)内でlog4j.xmlを使用していたので例外が発生しました。 log4jのパラメータは<param name="File" value="${error.file}"/>です。したがって、log4jは、ファイル名が$ {error.file}(存在しない)のログファイルを探しています。私が上で述べたように、私はVMの引数を上に置いて解決しました。

教訓:log4j実行でFileNotFoundExceptionが発生した場合は、log4jが設定ファイルを取得している場所を確認するために-Dlog4j.debugをVM引数として入力してみてください。

私がテストしている方法の中で期待されるすべてのオブジェクトを完成させて2番目を解決します。 jMockメッセージはちょっとあいまいです。

教訓:予期せぬ呼び出しは、通常、テストしているメソッドで使用されているオブジェクトまたは模擬オブジェクトがテストメソッド内にないことを意味します。また、呼び出すオブジェクトに期待を設定していないことを意味します。

4

次の2つのオプションを持っている...

を設定あなたは、単にあなたのテスト/ resourcesフォルダにlog4j.propertiesを作成する必要があるため、2番目のオプションは簡単です。

+0

応答ありがとうAndrew。私はjMockに固執する必要があるPowerMockを使用するオプションがありません。 log4j.xmlを使用すると、xmlバージョンの代わりにプロパティファイルを使用するとDOMConfigurator.configureが機能しますか? – Zorlac

+0

みんな、私は私の問題を解決しました。応答していただきありがとうございます。 – Zorlac