1. 程式人生 > >Junit結合Spring對Dao層進行單元測試

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

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

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


@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 {

@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);
}

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