轉載自 http://blog.csdn.net/funi16/article/details/8691575html
在寫單元測試的時候,通常是對數據庫進行增刪改查的操做,這個時候,若是以前刪除了某條記錄,天然後面的程序就找不到這條記錄了,因此能夠經過配置spring的事務管理或者測試框架來回滾,減小工做量。使用的數據庫是postgreSQL和mysql。java
在寫這篇文章的時候,不少地方借鑑了下面兩篇文章:mysql
http://www.cnblogs.com/rainisic/archive/2012/01/22/Spring_Test_Framework.htmlspring
http://blog.163.com/wf_shunqiziran/blog/static/17630720920121084325322/sql
建立一個測試用的類,推薦名稱爲 「被測試類名稱 + Test」。數據庫
測試類應該繼承與 AbstractJUnit4SpringContextTests 或 AbstractTransactionalJUnit4SpringContextTestsapp
對於 AbstractJUnit4springcontextTests 和 AbstractTransactionalJUnit4SpringContextTests 類的選擇:框架
若是再你的測試類中,須要用到事務管理(好比要在測試結果出來以後回滾測試內容),就可使用AbstractTransactionalJUnit4SpringTests類。事務管理的使用方法和正常使用Spring事務管理是同樣的。再此須要注意的是,若是想要使用聲明式事務管理,即便用AbstractTransactionalJUnitSpringContextTests類,請在applicationContext.xml文件中加入transactionManager bean:post
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
若是沒有添加上述bean,將會拋出NoSuchBeanDefinitionException,指明 No bean named 'transactionManager' is definded.單元測試
添加以下內容在class前,用於配置applicationContext.xml文件的位置。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
建立測試用方法,推薦名稱爲 「被測方法名稱+ Test」。
測試方法上方加入 @Test
右鍵方法名,選擇則「Run As」→「JUnit Test」便可
我之前也是經過這種方法來配置單元測試的自動回滾的,不過在新的項目裏發現不行,因而又是各類度娘谷哥,終於找到了。順便說下我搜索到的不能自動回滾的集中緣由:
一、代碼中含有try-catch塊致使不能回滾。(我的以爲不靠譜)
二、方法裏面有非public方法。
三、加載了2次配置文件,致使insert和rollback方法不在一個事物裏面。我遇到的就是這種狀況。
如:我在註解當中已經加載了一次applicationContext.xml文件,而在setUp()裏面又加載了一次,致使方法被當成2個事物提交了。因而我使用註解來加載bean。
單元測試用例上面的註解是:
在applicationContext.xml文件當中: