在我以前一篇文章关于spring的文章中仔细讨论过spring单元测试策略,根据最近一些经验。今天再写一点自己的经验:
1.需要把单元测试时不需要的东西拿掉,比如缓存,安全等,这就需要怎么仔细考虑spring的applicationContext.xml功能。
2.DAO与Service的测试需要使用不同的策略,一般来讲,DAO单元测试只测试一个DAO类,而service需要多个DAO来支撑,有时还需要别的service支持。因此需要为DAO与service分别定义两个基类。DAO一般不需要使用事务,因此DAO测试基类继承AbstractDependencyInjectionSpringContextTests;而service需要,Service测试基类继承AbstractTransactionalDataSourceSpringContextTests
3.那怎么简化开发人员编写单元测试类呢?若每次都需要写很多,那他们自然不愿意写,所以架构师应该简化单元测试的编程模型上下功夫。一个原则:每个人只添加自己想要的,必要时可以覆盖全部的配置文件,完全自己来写,下面是我写的两个测试基类的demo
DAO测试基类
- publicabstractclassAbstractDAOTestCaseextends
- AbstractDependencyInjectionSpringContextTests{
- publicAbstractDAOTestCase(){
- this.setAutowireMode(AUTOWIRE_BY_NAME);
- }
- @Override
- protectedString[]getConfigLocations(){
- String[]baseConfigs=newString[]{"/spring/applicationContext.xml"};
- String[]extentConfigs=getExtentConfigs();
- intlength=baseConfigs.length+extentConfigs.length;
- String[]allConfigs=newString[length];
- for(inti=0;i<baseConfigs.length;i++){
- allConfigs[i]=baseConfigs[i];
- }
- for(inti=0;i<extentConfigs.length;i++){
- allConfigs[i+baseConfigs.length]=extentConfigs[i];
- }
- returnallConfigs;
- }
- //开发人员可以覆盖这个方法,添加自己的配置文件
- protectedString[]getExtentConfigs(){
- returnnewString[]{};
- }
- }
Service测试基类
- publicabstractclassAbstractServiceTestCaseextends
- AbstractTransactionalDataSourceSpringContextTests{
- protectedUserDAOuserDAO;
- publicAbstractServiceTestCase(){
- this.setAutowireMode(AUTOWIRE_BY_NAME);
- }
- @Override
- protectedString[]getConfigLocations(){
- String[]baseConfigs=newString[]{"spring/applicationContext.xml",
- "spring/applicationContext-transaction.xml",
- "org/codehaus/xfire/spring/xfire.xml",
- "spring/applicationContext-xfire.xml",
- "spring/applicationContext-osworkflow.xml",
- "spring/platform/*.xml"};
- String[]extentConfigs=getExtentConfigs();
- intlength=baseConfigs.length+extentConfigs.length;
- String[]allConfigs=newString[length];
- for(inti=0;i<baseConfigs.length;i++){
- allConfigs[i]=baseConfigs[i];
- }
- for(inti=0;i<extentConfigs.length;i++){
- allConfigs[i+baseConfigs.length]=extentConfigs[i];
- }
- returnallConfigs;
- }
- //开发人员可以覆盖这个方法
- protectedString[]getExtentConfigs(){
- returnnewString[]{};
- }
- publicvoidsetUserDAO(UserDAOuserDAO){
- this.userDAO=userDAO;
- }
- }