實際開發過程中,寫單元測試是非常難的一件事情,其主要原因是代碼結構不夠好,導致單元測試不好寫。特別是Dao層,因為Dao層代碼都是與數據庫相關的,所以我們在對Dao層代碼進行單元測試的時候,不僅僅要考慮我在上篇文章中提到的代碼隔離,還要注意單元測試不能帶來臟數據。另外,dao層實例依賴spring上下文,我們怎么樣來解決這個問題?
看看下面的一個的測試實例:
/** * @author lisanlai <br /> * Mail: sanlai_lee@qq.com<br /> * Blog:http://blog.lisanlai.cn <br /> */ @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<Employee> 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) |