Maven2+djUnit その3 … ついに動いた!

Maven2djUnit(のVirtual Mock Object)を使う、という調査。ついに完了しました。

結論だけ先に。

まず、pom.xmlsurefire 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.3
    
    
      asm
      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)
    • バイトコードライブラリにasm, 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を使うでしょうし...