這裏只探討業務層的測試。原來的測試封裝了一個BaseServiceTest類,繼承自spring提供的AbstractTransactionalDataSourceSpringContextTests。在onSetUpBeforeTransaction方法裏通過dbunit把準備數據插入數據庫。執行測試方法。回滾事務,在onTearDownAfterTransaction方法裏通過dbunit刪除準備數據。這個大家應該都很熟悉了。
用groovy寫測試有幾點要注意:
1. 我的測試都是在eclipse裏面跑,需要在eclipse.ini裏面加上-Dfile.encoding=UTF-8 。不然groovy文件裏的中文會是亂碼。
2.取消spring的bean dependency check。因爲每個groovy類都實現了GroovyObject接口,都有setMetaClass方法,spring找不到metaClass這個bean會報錯。如果你的測試類繼承了AbstractTransactionalDataSourceSpringContextTests,調用setDependencyCheck(false)方法就行。
3.因爲我們的測試類繼承了自己的BaseServiceTest,所以不能繼承groovy的GroovyTestCase類。但是我們又想用GroovyTestCase提供的驗證方法,怎麼辦?
可以把GroovyTestCase提供的驗證方法賦給父類的字段,比如
final shouldFail = new GroovyTestCase().&shouldFail
用groovy寫測試,代碼量比差不多是原來的60%-70%(行數少了,分號沒了,默認public,getter/setter用./.=替代,等等),關鍵是可以當作學習groovy的練習,大家試試吧。
測試代碼大致如下:
class DepartmentServiceTest extends BaseServiceTest{
DepartmentService departmentService
final shouldFail = new GroovyTestCase().&shouldFail
//測試新建部門,當名稱爲空應該拋出異常
void testAddDepartmentFailBecauseNameEmpty() {
shouldFail(BusinessException){
departmentService.saveOrUpdate(new Department())
}
}
//測試新建部門,當名稱重複應該拋出異常
void testAddDepartmentFailBecauseNameExist() {
Department department = new Department()
department.name = "人力資源"
shouldFail(BusinessException){
departmentService.saveOrUpdate(department)
}
}
String[] getDataSetFileNames(){
["department.xml"]
}
}