Junit結合Spring對Dao層進行單元測試


關於單元測試,上一次就簡單的概念和Mock基礎做了,參考:http://60.174.249.204:8888/in/modules/article/view.article.php/74

實際開發過程中,寫單元測試是非常難的一件事情,其主要原因是代碼結構不夠好,導致單元測試不好寫。特別是Dao層,因為Dao層代碼都是與數據庫相關的,所以我們在對Dao層代碼進行單元測試的時候,不僅僅要考慮我在上篇文章中提到的代碼隔離,還要注意單元測試不能帶來臟數據。另外,dao層實例依賴spring上下文,我們怎么樣來解決這個問題?

看看下面的一個的測試實例:

/**
* @author lisanlai

* Mail: sanlai_lee@qq.com

* Blog:http://blog.lisanlai.cn

*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "/META-INF/spring/sellmanager-context.xml",
"/META-INF/spring/dao-context.xml",
"/META-INF/spring/mvc-context.xml" })
//@Transactional
public class SysEmployeeDaoTest {

/**
* 測試deleteEmployee方法 .
* Method Name:deleteEmployee .
* the return type:void
*/
@Test
public void deleteEmployee() {
Employee employee = new Employee();
employee.setEmployeeCode(""+new Date().getTime());
employee.setEmployeeName("lisanlai");
employee.setDelFlag("0");
String empId = sysEmployeeDao.save(employee);
Assert.assertNotNull("新增的員工ID為null",empId);

//把該id對應的員工刪除
sysEmployeeDao.deleteEmployee(empId);
//再用該ID去查數據庫,如果為空,說明刪除方法邏輯正確
Employee emp = sysEmployeeDao.get(empId);
Assert.assertNotNull(emp);
Assert.assertArrayEquals("deleteEmployee方法邏輯不正確,員工沒有被刪除",
new String[]{"1"}, new String[]{emp.getDelFlag()});
//刪除員工對象
sysEmployeeDao.delete(emp);
}


/**
* 測試saveEmployee方法 .
* Method Name:saveEmployee .
* the return type:void
*/
@Test
@Transactional
@Rollback(true)
public void saveEmployee() {
Employee employee = new Employee();
employee.setEmployeeName("lisanlai");
String empCode = ""+new Date().getTime();
employee.setEmployeeCode(empCode);
sysEmployeeDao.saveEmployee(employee);

//通過code查找員工
List emps = sysEmployeeDao.findByNamedParam(
new String[]{"employeeCode"},
new String[]{empCode});
Assert.assertTrue("saveEmployee方法邏輯錯誤,員工保存失敗!", !emps.isEmpty());
}

}

注意類上的三個注解:

//指定測試用例的運行器 這里是指定了Junit4
@RunWith(SpringJUnit4ClassRunner.class)
//指定Spring的配置文件 路徑相對classpath而言
@ContextConfiguration({ "/META-INF/spring/sellmanager-context.xml",
"/META-INF/spring/dao-context.xml",
"/META-INF/spring/mvc-context.xml" })
//如果在類上面使用該注解,這樣所有的測試方案都會自動的 rollback
//@Transactional


再注意saveEmployee方法上的兩個注解:
//這個注解表示使用事務
@Transactional
//這個表示方法執行完以后回滾事務,如果設置為false,則不回滾
@Rollback(true)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM