ユニットテストのJunnitとspring統合


Springテスト注釈を使用して、よくあるJunnit 4またはTestNGのユニットテストを行い、SpringにアクセスするbeanFactoryと自動化された事務管理をサポートします.一、スプリングテスト注解ラベル1.@ContectConfigrationと@Configrationの使用
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("  ,    ");
	}
}