1. 程式人生 > >利用Spring測試類測試Dao和Service

利用Spring測試類測試Dao和Service

    首先新增包spring-mock-1.2.6.jar或spring-test-3.2.0.RELEASE.jar。在包org.springframework.test下可以看到Spring測試父類:
    1、AbstractSpringContextTests類[1],該類全部方法是protected的,通常不使用這個類,而使用它的子類們。  
   
    2、AbstractDependencyInjectionSpringContextTests類[2]:繼承於類[1]:如果僅僅使用Spring依賴注入功能,可以讓測試用例繼承該類。  
  
    3、AbstractTransactionalSpringContextTests類[3]:繼承於類[2], 繼承該類的測試用例在spring管理的事務中進行,測試完後對資料庫的記錄不會造成任何影響。對資料庫進行一些操作後,它會自動把資料庫回滾,這樣就保證了你的測試對於環境沒有任何影響。  

    4、AbstractTransactionalDataSourceSpringContextTests:繼承於類[3],  功能更強大,用於測試持久層元件,看其原始碼,  有一行"protected JdbcTemplate jdbcTemplate;",提供了一個JdbcTemplate的變數, 通過該物件可以直接操作資料庫。 
    繼承了這四個類的測試類都是屬於Test Case性質,可以在Test Suite裡跑。
 
    在包org.springframework.test.context.junit4下的Spring測試父類AbstractTransactionalJUnit4SpringContextTests

同樣在spring管理的事務中進行,但是繼承該類後無法再在Test Suite裡跑。

    以下是測試Service的Abstract方法,寫測試類時可以繼承該方法,讓測試類變得簡單。至於Dao的測試類寫法就大同小異了。

AbstractServiceTests.java

package cn.com.test;

import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;

/**
 * 基於AbstractTransactionalSpringContextTests的抽象測試類
 * 
 * 繼承此類,某個測試方法需要事物回滾時,直接在方法前加@Rollback(true)即可
 * 
 * @author Bruce Qin 2010.10.11
 */
public abstract class AbstractServiceTests extends
		AbstractTransactionalDataSourceSpringContextTests {

	// 專案classpath路徑
	String applicationContextFile = "classpath:applicationContext-common.xml";

	/**
	 * 無參建構函式
	 */
	public AbstractServiceTests() {
		super();
	}

	/**
	 * 有參建構函式
	 * 
	 * @param name
	 */
	public AbstractServiceTests(String name) {
		super(name);
	}

	/**
	 * 需要載入的配置檔案地址列表
	 * 
	 * @return new String[] { applicationContextFile };
	 */
	abstract String[] getOtherConfigs();

	/**
	 * 覆蓋的獲取配置檔案地址的方法
	 */
	protected String[] getConfigLocations() {
		String[] otherConfigs = getOtherConfigs();
		// 所有配置檔案列表
		String[] configFiles = new String[otherConfigs.length + 1];
		configFiles[0] = applicationContextFile;

		/**
		 * public static void arraycopy(Object src, int srcPos, Object dest, int
		 * destPos, int length) 源陣列中位置在 srcPos到srcPos+length-1 之間的元件被分
		 * 別複製到目標陣列中的 destPos 到 destPos+length-1 位置。
		 */
		System.arraycopy(otherConfigs, 0, configFiles, 1, otherConfigs.length);
		return configFiles;
	}
}

測試類ServiceTest.java程式碼如下:

package cn.com.test;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import cn.com.entity.User;
import cn.com.service.IUserService;

public class ServiceTest extends AbstractServiceTests {

	@Autowired
	private IUserService userService;

	@Override
	String[] getOtherConfigs() {
		return new String[] { applicationContextFile };
	}

	@Test
	// 測試新增使用者
	public void testSave() {
		User user = new User();
		user.setUsername("rongxh7");
		user.setPassword("blogjava");
		userService.save(user);
	}

}