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)php

相關文章
相關標籤/搜索