使用Spring进行单元测试(上)

发表于:2013-6-05 11:03

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:赵才文    来源:51Testing软件测试网采编

  清单 3. AccountService.Java

  1. package service;  
  2.    
  3. import org.apache.commons.logging.Log;  
  4. import org.apache.commons.logging.LogFactory;  
  5. import org.Springframework.beans.factory.annotation.Autowired;  
  6.    
  7. import DAO.AccountDao;  
  8. import domain.Account;  
  9.    
  10. public class AccountService {  
  11.     private static final Log log = LogFactory.getLog(AccountService.class);  
  12.    
  13.     @Autowired 
  14.     private AccountDao accountDao;  
  15.    
  16.     public Account getAccountById(int id) {  
  17.         return accountDao.getAccountById(id);  
  18.     }  
  19.    
  20.     public void insertIfNotExist(Account account) {  
  21.         Account acct = accountDao.getAccountById(account.getId());  
  22.         if(acct==null) {  
  23.             log.debug("No "+account+" found,would insert it.");  
  24.             accountDao.saveAccount(account);  
  25.         }  
  26.         acct = null;  
  27.     }  
  28.    
  29. }

  AccountService 包括下列方法:

  ● getAccountById:根据 Id 查询账号信息
  ● insertIfNotExist:根据传入的对象插入数据库

  其依赖的 DAO 对象 accountDao 是通过 Spring 注释标签 @Autowired 自动注入的。

  清单 4. Spring 配置文件

  上述几个类的依赖关系是通过 Spring 进行管理的,配置文件如下:

  1. <beans xmlns="http://www.Springframework.org/schema/beans" 
  2.      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  3.  xmlns:context="http://www.Springframework.org/schema/context" 
  4.  xsi:schemaLocation="http://www.Springframework.org/schema/beans  
  5.    
  6. http://www.Springframework.org/schema/beans/Spring-beans-3.0.xsd  
  7.    
  8.    
  9. http://www.Springframework.org/schema/context  
  10.    
  11.  http://www.Springframework.org/schema/context/Spring-context-3.0.xsd "> 
  12.    
  13.  <context:annotation-config/> 
  14.  <bean id="datasource"> 
  15.          <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> 
  16.          <property name="url" value="jdbc:hsqldb:hsql://localhost" /> 
  17.          <property name="username" value="sa" /> 
  18.          <property name="password" value="" /> 
  19.      </bean> 
  20.      <bean id="initer" init-method="init"> 
  21.      </bean> 
  22.  <bean id="accountDao" depends-on="initer"> 
  23.          <property name="dataSource" ref="datasource" /> 
  24.      </bean> 
  25.  <bean id="accountService"> 
  26.      </bean> 
  27.  </beans>

  注意其中的“<context:annotation-config/>”的作用,这个配置启用了 Spring 对 Annotation 的支持,这样在我们的测试类中 @Autowired 注释才会起作用(如果用了 Spring 测试框架,则不需要这样的配置项,稍后会演示)。另外还有一个 accountDao 依赖的 initer bean, 这个 bean 的作用是加载 log4j 日志环境,不是必须的。

  另外还有一个要注意的地方,就是 datasource 的定义,由于我们使用的是 Spring Jdbc Template,所以只要定义一个 org.Springframework.jdbc.datasource.DriverManagerDataSource 类型的 datasource 即可。这里我们使用了简单的数据库 HSQL、Single Server 运行模式,通过 JDBC 进行访问。实际测试中,大家可以选择 Oracle 或者 DB2、Mysql 等。

  好,万事具备,下面我们来用 Junit4 框架测试 accountService 类。代码如下:

  清单 5. AccountServiceOldTest.Java

  1. package service;  
  2.    
  3. import static org.Junit.Assert.assertEquals;  
  4.    
  5. import org.Junit.BeforeClass;  
  6. import org.Junit.Test;  
  7. import org.Springframework.context.ApplicationContext;  
  8. import org.Springframework.context.support.ClassPathXmlApplicationContext;  
  9.    
  10. import domain.Account;  
  11.    
  12. public class AccountServiceOldTest {  
  13.     private static AccountService service;  
  14.    
  15.     @BeforeClass 
  16.     public static void init() {  
  17.         ApplicationContext  
  18. context = new ClassPathXmlApplicationContext("config/Spring-db-old.xml");  
  19.         service = (AccountService)context.getBean("accountService");  
  20.     }   
  21.    
  22.     @Test 
  23.     public void testGetAcccountById() {  
  24. Account acct = Account.getAccount(1"user01"18"M");  
  25.         Account acct2 = null;  
  26.         try {  
  27. service.insertIfNotExist(acct);  
  28.             acct2 = service.getAccountById(1);  
  29.             assertEquals(acct, acct2);  
  30.         } catch (Exception ex) {  
  31.             fail(ex.getMessage());  
  32.         } finally {  
  33.             service.removeAccount(acct);  
  34.         }  
  35. }  
  36. }

  注意上面的 Junit4 注释标签,第一个注释标签 @BeforeClass,用来执行整个测试类需要一次性初始化的环境,这里我们用 Spring 的 ClassPathXmlApplicationContext 从 XML 文件中加载了上面定义的 Spring 配置文件,并从中获得了 accountService 的实例。第二个注释标签 @Test 用来进行实际的测试。

  测试过程:我们先获取一个 Account 实例对象,然后通过 service bean 插入数据库中,然后通过 getAccountById 方法从数据库再查询这个记录,如果能获取,则判断两者的相等性;如果相同,则表示测试成功。成功后,我们尝试删除这个记录,以利于下一个测试的进行,这里我们用了 try-catch-finally 来保证账号信息会被清除。

  执行测试:(在 Eclipse 中,右键选择 AccountServiceOldTest 类,点击 Run as Junit test 选项),得到的结果如下:

  执行测试的结果

  在 Eclipse 的 Junit 视图中,我们可以看到如下的结果:

  图 2. 测试的结果

  对于这种不使用 Spring test 框架进行的单元测试,我们注意到,需要做这些工作:

  ● 在测试开始之前,需要手工加载 Spring 的配置文件,并获取需要的 bean 实例

  ● 在测试结束的时候,需要手工清空搭建的数据库环境,比如清除您插入或者更新的数据,以保证对下一个测试没有影响

43/4<1234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号