必要最低限なspring-testに関する情報をまとめてみる。
JUnitと Springを連携させるには、spring.jarの他に spring-test.jar が必要となります。
Springのログはcommons-logging.jarが必要となります。
プロジェクトのビルドパスに通しておきます。たしか、外部jarの追加だったかな。
Eclipseについている JUnitはちょっと古くて、Springに対応するために必要なインターフェイスが存在していない。なので ひょっとしたらEclipseに標準で付属している JUnitではなく、新たにダウンロードする必要があるかもしれない。
Eclipseについてる JUnitはふるいかも知れないので下記からjarファイルをダウンロードといいらしい。
「spring-mock.jar」はSpring 2.5ではTestContext?フレームワークに焦点を絞った「spring-test.jar」に置き換えられました。しかし「spring-test.jar」には「spring-mock.jar」の内容がすべて含まれているので、既存の単体・結合テストで使用する場合でもそのまま置き換えることができます。
ポイントカットとかインターセプターとかいろいろ、いいまわしがありますが、
ようするに、本体のクラスには手をつけずに、メソッドの実行の事前準備と事後処理を行う手段です。
裏を返せば、本体のクラスに手をつけていいのならば、こんなまどろっこしいことはしなくてもいいのです。
テストコードをクラスに紛れ込ませないようにする姿勢を貫くことができるのが、springのいいところなのです。
Springでは、依存性を注入する方法が、いつか準備されていますが、
基本を抑えることは大切なことです。そこで、
最小限のサンプルを用意しましたので、これを元に考えを深めていこうと思います。
<?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>
package sample;
public interface IHelloWorldBean {
public abstract String getName();
public abstract void setName(String name);
public abstract void helloworld();
}
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");
}
}
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;
}
}
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();
}
}
もともとクラスしかない状態からここまで、持ってくる手順をかんがえる。
便利にするIDEがあると思い調べるとやっぱりプラグインがありました。
https://olex.openlogic.com/packages/eclipseplugin-springide
http://walbrix.net/blog/2010/05/spring.html
https://www.myeclipseide.jp/modules/contents04/index.php?id=32