*目次 [#mf0b07c2] #contents *趣旨 [#vc5104fe] 必要最低限なspring-testに関する情報をまとめてみる。 *spring-test.jar [#k9376870] JUnitと Springを連携させるには、spring.jarの他に spring-test.jar が必要となります。 *commons-logging.jar [#y1f4fc40] Springのログはcommons-logging.jarが必要となります。 プロジェクトのビルドパスに通しておきます。たしか、外部jarの追加だったかな。 **Eclipseについてる JUnitを捨てる [#hffd8fe1] Eclipseについている JUnitはちょっと古くて、Springに対応するために必要なインターフェイスが存在していない。なので ひょっとしたらEclipseに標準で付属している JUnitではなく、新たにダウンロードする必要があるかもしれない。 **JUnitをダウンロード [#l02a4aff] Eclipseについてる JUnitはふるいかも知れないので下記からjarファイルをダウンロードといいらしい。 http://www.junit.org/ 「spring-mock.jar」はSpring 2.5ではTestContextフレームワークに焦点を絞った「spring-test.jar」に置き換えられました。しかし「spring-test.jar」には「spring-mock.jar」の内容がすべて含まれているので、既存の単体・結合テストで使用する場合でもそのまま置き換えることができます。 *ポイントカットとかインターセプターとか [#x5664200] ポイントカットとかインターセプターとかいろいろ、いいまわしがありますが、 ようするに、本体のクラスには手をつけずに、メソッドの実行の事前準備と事後処理を行う手段です。 裏を返せば、本体のクラスに手をつけていいのならば、こんなまどろっこしいことはしなくてもいいのです。 テストコードをクラスに紛れ込ませないようにする姿勢を貫くことができるのが、springのいいところなのです。 *SpringのHelloWorld的サンプル [#v01707a3] Springでは、依存性を注入する方法が、いつか準備されていますが、 基本を抑えることは大切なことです。そこで、 最小限のサンプルを用意しましたので、これを元に考えを深めていこうと思います。 **xml定義 [#k0fa8e8c] <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="helloWorldBeanImpl" class="sample.HelloWorldBeanImpl" > <property name="name" > <value>名前</value> </property> </bean> <bean id="helloworld" class="org.springframework.aop.framework.ProxyFactoryBean" > <!-- インタフェースを定義 --> <property name="proxyInterfaces"> <value>sample.IHelloWorldBean</value> </property> <!-- 実装を定義 local=にはbeanidを入れる--> <property name="target"><ref local="helloWorldBeanImpl"/></property> <property name="interceptorNames"> <value>regexpAdvisor</value> </property> </bean> <bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice"> <ref local="myMethodInterceper"/> </property> <property name="patterns"> <list> <value>.*.world*</value> </list> </property> </bean> <bean id="myMethodInterceper" class="sample.MyMethodIntercepter"/> </beans> **sample.IHelloWorldBean [#tb8a5e08] package sample; public interface IHelloWorldBean { public abstract String getName(); public abstract void setName(String name); public abstract void helloworld(); } **sample.HelloWorldBeanImpl [#ldf0b245] package sample; public class HelloWorldBeanImpl implements IHelloWorldBean { public HelloWorldBeanImpl() {} private String name; public String getName() {return name;} public void setName(String name) {this.name = name;} public void helloworld() { System.out.println("Helloworld"); } } **sample.MyMethodIntercepter [#f7e16b65] package sample; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class MyMethodIntercepter implements MethodInterceptor{ public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("メソッド実行前"); Object result = invocation.proceed(); System.out.println("メソッド実行後"); return result; } } **SpringTest [#i3e169ae] import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringTest { public static void main(String args[]){ BeanFactory contxt = new ClassPathXmlApplicationContext("applicationContext.xml"); sample.IHelloWorldBean hello = (sample.IHelloWorldBean)contxt.getBean("helloworld"); hello.helloworld(); } } **考察 [#s2a906c8] もともとクラスしかない状態からここまで、持ってくる手順をかんがえる。 ***手順 [#o58e965f] -public系のメソッドからspring化したいメソッドのインタフェースを作成します。 -元クラスをインタフェースを実装した形にします。 -org.aopalliance.intercept.MethodInterceptorをimplementsしたクラスを用意します。 これはクラス固有のメソッドを含まない形式でもいけるので、まずは雛形をコピーするだけでOKでしょう。 -次に設定ファイルを用意します。結構決まりきった形になっています。 *spring ide [#rfdd0a96] 便利にするIDEがあると思い調べるとやっぱりプラグインがありました。 https://olex.openlogic.com/packages/eclipseplugin-springide **参考URL [#b5d9a043] http://walbrix.net/blog/2010/05/spring.html *参考 [#a3ace723] ***Spring 入門 - 日本語MyEclipse [#c9cbfd4b] https://www.myeclipseide.jp/modules/contents04/index.php?id=32