再讨论spring的单元测试

在我以前一篇文章关于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测试基类

  1. publicabstractclassAbstractDAOTestCaseextends
  2. AbstractDependencyInjectionSpringContextTests{
  3. publicAbstractDAOTestCase(){
  4. this.setAutowireMode(AUTOWIRE_BY_NAME);
  5. }
  6. @Override
  7. protectedString[]getConfigLocations(){
  8. String[]baseConfigs=newString[]{"/spring/applicationContext.xml"};
  9. String[]extentConfigs=getExtentConfigs();
  10. intlength=baseConfigs.length+extentConfigs.length;
  11. String[]allConfigs=newString[length];
  12. for(inti=0;i<baseConfigs.length;i++){
  13. allConfigs[i]=baseConfigs[i];
  14. }
  15. for(inti=0;i<extentConfigs.length;i++){
  16. allConfigs[i+baseConfigs.length]=extentConfigs[i];
  17. }
  18. returnallConfigs;
  19. }
  20. //开发人员可以覆盖这个方法,添加自己的配置文件
  21. protectedString[]getExtentConfigs(){
  22. returnnewString[]{};
  23. }
  24. }

Service测试基类

  1. publicabstractclassAbstractServiceTestCaseextends
  2. AbstractTransactionalDataSourceSpringContextTests{
  3. protectedUserDAOuserDAO;
  4. publicAbstractServiceTestCase(){
  5. this.setAutowireMode(AUTOWIRE_BY_NAME);
  6. }
  7. @Override
  8. protectedString[]getConfigLocations(){
  9. String[]baseConfigs=newString[]{"spring/applicationContext.xml",
  10. "spring/applicationContext-transaction.xml",
  11. "org/codehaus/xfire/spring/xfire.xml",
  12. "spring/applicationContext-xfire.xml",
  13. "spring/applicationContext-osworkflow.xml",
  14. "spring/platform/*.xml"};
  15. String[]extentConfigs=getExtentConfigs();
  16. intlength=baseConfigs.length+extentConfigs.length;
  17. String[]allConfigs=newString[length];
  18. for(inti=0;i<baseConfigs.length;i++){
  19. allConfigs[i]=baseConfigs[i];
  20. }
  21. for(inti=0;i<extentConfigs.length;i++){
  22. allConfigs[i+baseConfigs.length]=extentConfigs[i];
  23. }
  24. returnallConfigs;
  25. }
  26. //开发人员可以覆盖这个方法
  27. protectedString[]getExtentConfigs(){
  28. returnnewString[]{};
  29. }
  30. publicvoidsetUserDAO(UserDAOuserDAO){
  31. this.userDAO=userDAO;
  32. }
  33. }
阅读更多

没有更多推荐了,返回首页