Maven2+djUnit その3 … ついに動いた!
Maven2でdjUnit(のVirtual Mock Object)を使う、という調査。ついに完了しました。
結論だけ先に。
まず、pom.xmlで surefire plugin に設定を加える必要があります。
maven-surefire-plugin 2.4.2 -Djava.system.class.loader=jp.co.dgic.testing.common.DJUnitClassLoader -Djp.co.dgic.eclipse.virtualmock.usevirtualmock=true -Djp.co.dgic.eclipse.coverage.usecoverage=false -Djp.co.dgic.eclipse.project.source.dir=${project.build.sourceDirectory} -Djp.co.dgic.eclipse.virtualmock.ignore.library=false
always true
次に、djUnitに関するdependencyを追加します。
ただし、djunitのjarはcentral-repoで提供されていないようなので、ローカルリポジトリでも構築するか、install:install-fileしておいてください.
asm, oroはこれでいけると思う(oroいらないかも?)
scope=test とかは省略しちゃってます。
jp.co.dgic djunit 0.8.20.8.3asm asm 3.0_RC1 oro oro 2.0.7
あとは、
$ mvn test
動いたーーー!!というわけです。
以下、詳細。
まず、システムクラスローダーをDJUnitClassLoaderにする旨をsurefire(からforkするJavaVM)に指示すること。これが一番重要です。前回書いたIsolatedClassLoaderの件がありますので、useSystemClassLoaderを指定する必要がある、というわけです。
で、DJUnitClassLoaderは、クラスをアドバンスするかどうかの判断に「特定のディレクトリ(ソースディレクトリ)にjavaソースが存在するかどうか」を使っていますので、この設定を追加しています。ここが重要/ドハマリでした. ソースおっかけたらすぐ解ったのに、遠回りしてしまいました。
-Djp.co.dgic.eclipse.project.source.dir=${project.build.sourceDirectory}
あとの設定はdjUnitの挙動の設定ですね。システムプロパティで指定するスタイルはundocumentedな気もするので以下に列挙しておきます。
- jp.co.dgic.eclipse.virtualmock.usevirtualmock=true
- Virtual Mock Objectを使うかどうかを指定します
- jp.co.dgic.eclipse.virtualmock.ignore.library=false
- 細かい内容は忘れましたが、eclipseでも似たような項目があります
- jp.co.dgic.eclipse.coverage.usecoverage=false
- com.jcoverage.rawcoverage.dir=C:/workspace/....(みたいな)
- カバレッジを使うときには関係がありそうですが調査していません。
- jp.co.dgic.eclipse.classloader.bytecodelibrary=(BCELかASM)
- jp.co.dgic.eclipse.project.source.dir=...
- 前述の通り超重要アイテム
と、いうわけで、maven2+djUnit編、終了です。
maven2+cloverかな、次は。これは簡単そう。
追記: djUnitのバージョンが0.8.2と例示していましたが0.8.3の誤り。0.8.3から enumやアノテーションの扱いが修正されていて謎のClass not foundエラーに悩まされることもなくなったので普通は0.8.3を使うでしょうし...