利用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
以下是測試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); } }