テストフレームワークとしてのDIコンテナ

Webアプリ書いてるときはともかく,ライブラリやフレームワーク的なものを書く時には JUnit でテストケースを書くようにしています。

んで,その時には Seasar を使っていようといまいと S2JUnit4 を使って書いています。

一番最初に Spring を使ったのもテストツールとしてだったんですが,やはり DI コンテナは JUnit でテスト書くのにとても便利です。

http://blog.tsukuba-bunko.jp/ppoi/archives/2008/06/s2junit4.html

と私の先生が言ってますが、DIコンテナの登場によりテストを書くことが一般的になってくるのかなあと思っています。

DIコンテナを使うからテストしやすくなるのか、テストしやすいからDIコンテナを使うのか、まあ鶏と卵な話ですが、いずれにせよテストを書くことの敷居が低くなっているのかなと。テストコードを書いたことの無い私が言うのもなんですがw

Quick JUnitプラグインのようなツールもありますしね。

上記のようなS2JUnit4 プラグインとQuick JUnitプラグインを組み合わせれば、テスト対象クラス、テストクラス、テストdiconをショートカットキーで行き来したり、テスト実行したりがスムーズになっていいのかなあなんて最近先生と話したりしてます。

この機能は最初Kijimunaにあるといいかなーなんて思ってましたが、用途を考えると別プラグインにするのがいいんでしょうね。

ただQuick JUnitプラグインだとメソッド名にtestとついているか@Testが無いとCtrl+0で実行できないんですね。
まあJUnitの仕様を考えれば当たり前だとは思います。

一方S2JUnit4だとメソッドにそんな縛りは無いので、Quick JUnitプラグインのCtrl+0が使えないですね。
以下のように@RunWith(Seasar2.class)があればOKなように変更すれば大丈夫なようですが。

Index: junit.extensions.eclipse.quick/src/junit/extensions/eclipse/quick/JavaElements.java
===================================================================
--- junit.extensions.eclipse.quick/src/junit/extensions/eclipse/quick/JavaElements.java	(revision 183)
+++ junit.extensions.eclipse.quick/src/junit/extensions/eclipse/quick/JavaElements.java	(working copy)
@@ -24,6 +24,8 @@
             return false;
         if(method.getElementName().startsWith("test")) return true;
         
+        if (hasS2JUnit4Annotation((IType)element.getParent())) return true;
+        
         return hasTestAnnotationOnMethod(method);
     }
 
@@ -71,6 +73,10 @@
     private static boolean hasSuiteAnnotation(IType type) throws JavaModelException {
         return type.getSource() == null ? false:type.getSource().indexOf("@SuiteClasses") > -1;
 	}
+    
+    private static boolean hasS2JUnit4Annotation(IType type) throws JavaModelException {
+        return type.getSource() == null ? false:type.getSource().indexOf("@RunWith(Seasar2.class)") > -1;
+	}
 
 	private static boolean isTestRunnerPassibleClass(IJavaElement element) throws JavaModelException {
         if (!(element instanceof IType))

それにしてもQuick JUnitプラグインの拡張ポイント(ショートカット?)の使い方は参考になるので見ておいたほうがよさそうですね。

参考:
Inside of Quick JUnit - Fly me to the Juno!
違うPluginのクラスメソッドを呼ぶための簡単な方法 - Fly me to the Juno!