以前只用用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。
2013年3月27日