Maven2+djUnit その2

Maven2djUnitを使う、という調査をしていて、その続報メモ。

まず、ここでいうdjUnitは "Virtual Mock Objectを使ったテストができること" と前提をおきます。jcoverageはこの際考えません。

で、 maven-surefire-plugin について色々と調べていくと、pom.xmlに以下のような記述をすることが出来ることがわかりました。

  
    
      
        maven-surefire-plugin
        2.4.2
	
		-Djava.system.class.loader=jp.co.dgic.testing.common.DJUnitClassLoader -Djp.co.dgic.eclipse.virtualmock.usevirtualmock=true
		always
		true

注目すべきは surefireのconfiguration で argLine forkMode useSystemClassLoader です。

surefireは実際に、テストで用いるjavaプロセスは(広義で)forkして実行しているわけですが、このときこのJavaVMにオプションを渡すことが出来ます。
上記の例では argLineの中で java.system.class.loader を設定してやることで、クラスローダーをdjUnitのものに乗っ取っているわけです*1

さらに、ほうっておくとsurefireの IsolatedClassLoaderとかいうクラスローダーが使われてしまうので 「ほっといてね」という意味で useSystemClassLoader をtrueに設定しています(これをしないと結局変わりませんから)

あとは、djUnitのjarとかを mvn install:install-file などして、pom.xmlに記入すればOK。会社とか複数人で使うなら身内のローカルリポジトリでも立てましょう。

さて、これで、テストケースの中でクラスローダーを見てみると確かに DJUnitClassLoaderにはなったのです。

ところが、いろいろオプションを足しても引いてもちゃんとコードが動かない。そもそもasmがクラスをmodifyしたときに出るべきログも出ないのです。というわけで今回はここまでとなりました。

一応針路は合っている気がしたのでここまでメモりました。

*1:ちなみに Tiger以降では -javaagentというオプションもあって、jMockitなんかはこちらを使って書き換えるのがスジのようです