ユニットテストのJunnitとspring統合
Springテスト注釈を使用して、よくあるJunnit 4またはTestNGのユニットテストを行い、SpringにアクセスするbeanFactoryと自動化された事務管理をサポートします.一、スプリングテスト注解ラベル1.@ContectConfigrationと@Configrationの使用
Spring 3.0に新しく提供された特性@Configrationは、この注釈タグによって、Java言語でbeanのインスタンスを定義することができます.
2.@ Dirties Conteet
デフォルトの場合、Springテストのフレームワークは、appication Conteetをロードすると、キャッシュされてしまい、変更されません.
Springは、運行期間中にaplication Contectの定義を変更することができるので、例えば、運行期間中にaplication Contectを取得して、それからregister Singleton方法を呼び出して新しいbeanを動的に登録します.このような場合、Springテストフレームを使ってappration Contextを修正したら、テスト問題をもたらします.私たちは運行期間中にapplication Contectを再読み込みしなければなりません.この時、テストクラスまたは方法にコメントできます.@Dirties Contect、役割は以下の通りです.
クラス(デフォルト)で定義されている場合は、ここでテストクラスの運転が完了したら、appication Contectを再読み込みします.
方法を定義すれば、つまりテスト方法の運転が完了したら、appication Contectを再読み込みします.
3.Transation、@Transation Configrationと@Rollback
デフォルトの場合、Springテストフレームワークは、transpationManagerという名前のbeanに事務管理を委託しています.もしあなたの事務マネージャがこの名前ではないなら、trnsactionManagerの属性名を指定する必要があります.defaultRollback属性も指定できます.デフォルトはtrueです.つまり、ある方法は全部rollbackです.falseに指定できます.ロックバックが必要な場合は、コメントラベル@Rollback(true)を指定すればいいです.事務の注釈は具体的に方法に触れることができる.
4.5@Repeat
@Repeatを通して、自分でforサイクルを書く代わりに、簡単に何度もテスト用の例を実行できます.使い方:
@Repeat(3)
@Test(expected=IllgalArgement Exception.class)
public void testInsertException()
service.insertIfNotExist(null)
}
これにより、testInsertExceptionは3回実行されます.
5.Active Profiles
Spring 3.2以降、Springから@Active Profilesを使用してテストクラスローディングのプロファイルを指定します.例えば、あなたのプロファイルは一つですが、生産環境に適合する構成とユニットテストの構成が必要です.profileを使用してbeansを定義することができます.
XMLヘッダではSpring 3.2のbeans定義を引用しました.Spring 3.2+だけがprofileによる定義をサポートしています.
ルートノードで「beans」定義を入れ替えることができます.profile属性を指定したいです.この構成では、二つのdatasourceを定義しました.一つはtest profileに属しています.一つはproduction profileを入力します.このようにして、テストプログラムにtest profileをロードできます.productionデータベースに影响を与えません.
以下では、いくつかのプロファイルに属するbeansを定義しています.すなわち「beans profile=」test、production」は、いくつかのbeanの定義を再利用するのに便利です.これらのbeanは両方のprofileで同じです.
構成例を参照してください.
依存度を追加:
appication Contect.xml
テストクラス:
Spring 3.0に新しく提供された特性@Configrationは、この注釈タグによって、Java言語でbeanのインスタンスを定義することができます.
package config;
import org.Springframework.beans.factory.annotation.Autowired;
import org.Springframework.context.annotation.Bean;
import org.Springframework.context.annotation.Configuration;
import org.Springframework.jdbc.datasource.DriverManagerDataSource;
import service.AccountService;
import service.Initializer;
import DAO.AccountDao;
@Configuration
public class SpringDb2Config {
private @Autowired DriverManagerDataSource datasource;
@Bean
public Initializer initer() {
return new Initializer();
}
@Bean
public AccountDao accountDao() {
AccountDao DAO = new AccountDao();
DAO.setDataSource(datasource);
return DAO;
}
@Bean
public AccountService accountService() {
return new AccountService();
}
}
@Contect Configrationで設定ファイルを指定します.Spring test frame eworkは自動的にXMLファイルをロードします.2.@ Dirties Conteet
デフォルトの場合、Springテストのフレームワークは、appication Conteetをロードすると、キャッシュされてしまい、変更されません.
Springは、運行期間中にaplication Contectの定義を変更することができるので、例えば、運行期間中にaplication Contectを取得して、それからregister Singleton方法を呼び出して新しいbeanを動的に登録します.このような場合、Springテストフレームを使ってappration Contextを修正したら、テスト問題をもたらします.私たちは運行期間中にapplication Contectを再読み込みしなければなりません.この時、テストクラスまたは方法にコメントできます.@Dirties Contect、役割は以下の通りです.
クラス(デフォルト)で定義されている場合は、ここでテストクラスの運転が完了したら、appication Contectを再読み込みします.
方法を定義すれば、つまりテスト方法の運転が完了したら、appication Contectを再読み込みします.
3.Transation、@Transation Configrationと@Rollback
デフォルトの場合、Springテストフレームワークは、transpationManagerという名前のbeanに事務管理を委託しています.もしあなたの事務マネージャがこの名前ではないなら、trnsactionManagerの属性名を指定する必要があります.defaultRollback属性も指定できます.デフォルトはtrueです.つまり、ある方法は全部rollbackです.falseに指定できます.ロックバックが必要な場合は、コメントラベル@Rollback(true)を指定すればいいです.事務の注釈は具体的に方法に触れることができる.
4.5@Repeat
@Repeatを通して、自分でforサイクルを書く代わりに、簡単に何度もテスト用の例を実行できます.使い方:
@Repeat(3)
@Test(expected=IllgalArgement Exception.class)
public void testInsertException()
service.insertIfNotExist(null)
}
これにより、testInsertExceptionは3回実行されます.
5.Active Profiles
Spring 3.2以降、Springから@Active Profilesを使用してテストクラスローディングのプロファイルを指定します.例えば、あなたのプロファイルは一つですが、生産環境に適合する構成とユニットテストの構成が必要です.profileを使用してbeansを定義することができます.
<beans xmlns="http://www.Springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.Springframework.org/schema/beans
http://www.Springframework.org/schema/beans/Spring-beans-3.2.xsd">
<beans profile="test">
<bean id="datasource"
class="org.Springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:hsql://localhost" />
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
</beans>
<beans profile="production">
<bean id="datasource"
class="org.Springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:hsql://localhost/prod" />
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
</beans>
<beans profile="test,production">
<bean id="transactionManager"
class="org.Springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource"></property>
</bean>
<bean id="initer" init-method="init" class="service.Initializer">
</bean>
<bean id="accountDao" depends-on="initer" class="DAO.AccountDao">
<property name="dataSource" ref="datasource"/>
</bean>
<bean id="accountService" class="service.AccountService">
</bean>
<bean id="envSetter" class="EnvSetter"/>
</beans>
</beans>
上の定義を見ました.XMLヘッダではSpring 3.2のbeans定義を引用しました.Spring 3.2+だけがprofileによる定義をサポートしています.
ルートノードで「beans」定義を入れ替えることができます.profile属性を指定したいです.この構成では、二つのdatasourceを定義しました.一つはtest profileに属しています.一つはproduction profileを入力します.このようにして、テストプログラムにtest profileをロードできます.productionデータベースに影响を与えません.
以下では、いくつかのプロファイルに属するbeansを定義しています.すなわち「beans profile=」test、production」は、いくつかのbeanの定義を再利用するのに便利です.これらのbeanは両方のprofileで同じです.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/config/Spring-db.xml")
@Transactional
@ActiveProfiles("test")
public class AccountServiceTest {
...
}
は上の@Active Profilesに注意して、1つまたは複数のprofileを指定してもいいです.そうすると、私たちのテストクラスはこれらの名前のprofileに定義されているbeanのインスタンスだけをロードします.構成例を参照してください.
依存度を追加:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.0.1.RELEASE</version>
</dependency>
spring構成:appication Contect.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-lazy-init="false">
<description>Spring </description>
<context:component-scan base-package="cn.slimsmart.unit.test.demo" />
</beans>
AddServiceImpl添加@serviceコメントテストクラス:
package cn.slimsmart.unit.test.demo.junit;
import static org.junit.Assert.assertTrue;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
// , SpringJUnit4ClassRunner
@RunWith(SpringJUnit4ClassRunner.class)
// Spring , XML Spring
@ContextConfiguration(locations = { "classpath*:/applicationContext.xml" })
// , rollback,
//@Transactional
//defaultRollback, , true
//transactionManager: spring
//@TransactionConfiguration(defaultRollback=true,transactionManager="transactionManager")
// , profile beans,
//@ActiveProfiles("test")
public class JunitSpringTest {
@Autowired
private AddService addService;
@Before
public void setUp(){
System.out.println(" ");
}
@Test
public void testAdd() {
assertTrue(addService.add(1, 1) == 2);
}
@After
public void destroy() {
System.out.println(" , ");
}
}