spring3+hibernate4+junit4單元測試

以前只用用junit做過service層的集成測試,獲取實例方法如下:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");

UserService userService = ctx.getBean("userService",UserService.class);

這個做集成測試沒有問題,但是做dao層的單元測試就不行了,dao測試類似:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
UserDao userDao = ctx.getBean("userDao",UserDao.class);

運行測試用例會報錯:

org.hibernate.HibernateException: No Session found for current thread

上網搜索得到的解決辦法如下:

spring配置文件中的sessionFactory這個bean下的hibernateProperties項下添加:

<prop key="hibernate.current_session_context_class">thread</prop>(或者是hibernate.current_session_context_class=thread,看你配置文件的寫法)

<property name="hibernateProperties">

<props>

<!-- 指定數據庫方言 -->

<!-- 是否根據需要每次自動創建數據庫 -->

<!-- 顯示Hibernate 持久化操作所生成的SQL -->

<!-- SQL腳本進行格式化後在輸出 -->

<!-- 解決no session found -->

<prop key="hibernate.current_session_context_class">thread</prop>

</props>

</property>

 

配置好了再運行,No Session found for current thread的錯誤消失,但是又有新的錯誤:

createQuery is not valid without active transaction

再上網搜索,得到的解決方法如下:

配置事務的時候需配置傳播特性:propagation="REQUIRED",但是我原本的配置就是這樣的啊:

<tx:advice id="txAdvice" transaction-manager="txManager">

<tx:attributes>

<tx:method name="get*" read-only="true"/>

<tx:method name="*" propagation="REQUIRED"/>

</tx:attributes>

</tx:advice>

 

最後解決辦法是:

 

引入架包spring-test-3.2.0.RELEASE.jar,修改測試用例的寫法,測試通過:

 

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

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

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.transaction.TransactionConfiguration;

import org.springframework.transaction.annotation.Transactional;

 

import com.ycm.model.User;

@RunWith(SpringJUnit4ClassRunner. class)

@ContextConfiguration(locations = { "classpath:beans.xml" })

@TransactionConfiguration(transactionManager="txManager" , defaultRollback=true)

@Transactional

public class UserDaoTest {

      @Autowired

      private UserDao userDao;

      @Test

      public void testXxx() {

               ....//測試用例

      }

}

 

總結:

結合spring-test架包進行junit單元測試,通過註解配置context@Autowired自動裝載注入要測試的類實例,還可可以配置事務,設置自動回滾,測試的時候只需要在數據庫中插入幾條測試數據就可以放心的測試了,不用擔心因爲測試而改變了數據庫中的數據。設置defaultRollback=true後,測試用例可以多次運行而運行結果不回變,因爲數據庫中的數據沒變,非常好用。當然這也可以根據實際需要設置爲true或者false

2013327


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章