Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2549135
  • 博文数量: 2110
  • 博客积分: 18861
  • 博客等级: 上将
  • 技术积分: 24420
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-05 18:23
文章分类

全部博文(2110)

文章存档

2011年(139)

2010年(1971)

我的朋友

分类: Java

2010-10-13 12:07:58

 在网上看了很多关于Junit测试Dao和Service的文章,然后做出自己需要的例子,这里源码共享一下,以此回馈一下
   介绍一下Srping的Junit扩展机制相关类:
       下载包:spring-test.jar
   在包org.springframework.test下的Spring测试父类
    1、AbstractSpringContextTests类[1],该类全部方法是protected的,通常不使用这个类,而使用它的子类们。  
   
    2、AbstractDependencyInjectionSpringContextTests类[2]:继承于类[1]:如果仅仅使用Spring依赖注入功能,可以让测试用例继承该类。  
  
    3、AbstractTransactionalSpringContextTests类[3]:继承于类[2], 继承该类的测试用例在spring管理的事务中进行,测试完后对数据库的记录不会造成任何影响。对数据库进行一些操作后,它会自动把数据库回滚,这样就保证了你的测试对于环境没有任何影响。  

    4、AbstractTransactionalDataSourceSpringContextTests:继承于类[3],  功能更强大,用于测试持久层组件,看其源代码,  有一行"protected JdbcTemplate jdbcTemplate;",提供了一个JdbcTemplate的变量, 通过该对象可以直接操作数据库。 
    继承了这四个类的测试类都是属于Test Case性质,可以在Test Suite里跑。
 
    在包org.springframework.test.context.junit4下的Spring测试父类
    AbstractTransactionalJUnit4SpringContextTests同样在spring管理的事务中进行,但是继承该类后无法再在Test Suite里跑。

    以下是测试Service的Abstract方法,写测试类时可以继承该方法,让测试类变得简单。
    AbstractServiceTransactionalTests.Java
   
Java代码 复制代码
  1. package com.Bruce.springJunit.service;   
  2. import org.springframework.test.AbstractTransactionalSpringContextTests;   
  3.   
  4. /**  
  5.  * 基于AbstractTransactionalSpringContextTests的抽象测试类  
  6.  *   
  7.  * 继承此类,某个测试方法需要事物回滚时,直接在方法前加@Rollback(true)即可  
  8.  * @author Bruce Qin 2010.10.11   
  9.  */  
  10. public abstract class AbstractServiceTransactionalTests extends  
  11.         AbstractTransactionalSpringContextTests {   
  12.   
  13.     // 文件系统绝对路径   
  14.     // String filePath = "file:D:/WorkSpace_JEE/ParkManager/src/";   
  15.     // String applicationContextFile = "applicationContext.xml";   
  16.   
  17.     // 项目classpath路径   
  18.      String applicationContextFile="classpath:applicationContext.xml";   
  19.   
  20.     /**  
  21.      * 无参构造函数  
  22.      */  
  23.     public AbstractServiceTransactionalTests() {   
  24.         super();   
  25.     }   
  26.   
  27.     /**  
  28.      * 有参构造函数  
  29.      *   
  30.      * @param name  
  31.      */  
  32.     public AbstractServiceTransactionalTests(String name) {   
  33.         super(name);   
  34.     }   
  35.   
  36.     /**  
  37.      * 需要加载的配置文件地址列表  
  38.      * @return new String[] { applicationContextFile };  
  39.      */  
  40.     abstract String[] getOtherConfigs();   
  41.   
  42.     /**  
  43.      * 覆盖的获取配置文件地址的方法  
  44.      */  
  45.     protected String[] getConfigLocations() {   
  46.         String[] otherConfigs = getOtherConfigs();   
  47.         // 所有配置文件列表   
  48.         String[] configFiles = new String[otherConfigs.length + 1];   
  49.         configFiles[0] = applicationContextFile;   
  50.   
  51.         /**  
  52.          * public static void arraycopy(Object src, int srcPos, Object dest, int  
  53.          * destPos, int length)   
  54.          * 源数组中位置在 srcPos到srcPos+length-1 之间的组件被分  
  55.          * 别复制到目标数组中的 destPos 到 destPos+length-1 位置。  
  56.          */  
  57.         System.arraycopy(otherConfigs, 0, configFiles, 1, otherConfigs.length);   
  58.         return configFiles;   
  59.     }   
  60.      

   
  
   测试类TestSysparamconfService.java 代码如下:
 
Java代码 复制代码
  1. package com.Bruce.springJunit.service;   
  2.   
  3. import java.util.List;   
  4. import org.junit.Test;   
  5. import org.springframework.beans.factory.annotation.Autowired;   
  6. import org.springframework.test.annotation.Rollback;   
  7. import com.Bruce.entity.Sysparamconf;   
  8. import com.Bruce.service.SysparamconfService;   
  9.   
  10. public class TestSysparamconfService extends AbstractServiceTransactionalTests {   
  11.   
  12.     @Autowired  
  13.     private SysparamconfService sysparamconfService;   
  14.   
  15.     @Override  
  16.     String[] getOtherConfigs() {   
  17.         return new String[] { applicationContextFile };   
  18.     }   
  19.   
  20.     @Test  
  21.     public void testFindAll() {   
  22.         // fail("Not yet implemented");   
  23.         System.out.println("test FindAll()---size "  
  24.                 + sysparamconfService.findAll().size());   
  25.     }   
  26.   
  27.     @Test  
  28.     @Rollback(true)   
  29.    //保护数据库现场,让事物不提交,直接rollback   
  30.     public void testWriteSysparameterSysparamconf() {   
  31.         System.out.println("test WriteSysparameter...");           
  32.         Sysparamconf sysparamconf = new Sysparamconf();   
  33.         boolean test;   
  34.         sysparamconf.setPname("testName2");   
  35.         sysparamconf.setPtype(1);   
  36.         sysparamconf.setPvalue("testName2_value2");   
  37.         test = sysparamconfService.writeSysparameter(sysparamconf);   
  38.         assertTrue(test);   
  39.   
  40.     }   
  41.   
  42. }  


    至于Dao的测试类写法就大同小异了。
     好了,基于框架的Junit测试用例的砖呀玉呀都抛完咯!
阅读(501) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~