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

发表于:2013-6-07 10:48

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

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

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

  Spring 测试注释标签

  我们已经看到利用 Spring test framework 来进行基于 Junit4 的单元测试是多么的简单,下面我们来看一下前面遇到的各种注释标签的一些可选用法。

  @ContextConfiguration 和 @Configuration 的使用

  刚才已经介绍过,可以输入 Spring xml 文件的位置,Spring test framework 会自动加载 XML 文件,得到 application context,当然也可以使用 Spring 3.0 新提供的特性 @Configuration,这个注释标签允许您用 Java 语言来定义 bean 实例,举个例子:

  现在我们将前面定义的 Spring-db1.xml 进行修改,我们希望其中的三个 bean:initer、accountDao、accountService 通过配置类来定义,而不是 XML,则我们需要定义如下配置类:

  注意:如果您想使用 @Configuration,请在 classpath 中加入 cglib 的 jar 包(cglib-nodep-2.2.3.jar),否则会报错。

  清单 8. SpringDb2Config.Java

  1. package config;  
  2.    
  3. import org.Springframework.beans.factory.annotation.Autowired;  
  4. import org.Springframework.context.annotation.Bean;  
  5. import org.Springframework.context.annotation.Configuration;  
  6. import org.Springframework.jdbc.datasource.DriverManagerDataSource;  
  7.    
  8. import service.AccountService;  
  9. import service.Initializer;  
  10. import DAO.AccountDao;  
  11.    
  12. @Configuration 
  13. public class SpringDb2Config {  
  14.     private @Autowired DriverManagerDataSource datasource;  
  15.     @Bean 
  16.     public Initializer initer() {  
  17.         return new Initializer();  
  18.     }  
  19.    
  20.     @Bean 
  21.     public AccountDao accountDao() {  
  22. AccountDao DAO = new AccountDao();  
  23. DAO.setDataSource(datasource);  
  24. return DAO;  
  25.     }  
  26.    
  27.     @Bean 
  28.     public AccountService accountService() {  
  29. return new AccountService();  
  30.     }  
  31. }

  注意上面的注释标签:

  ● @Configuration:表明这个类是一个 Spring 配置类,提供 Spring 的 bean 定义,实际效果等同于 XML 配置方法

  ● @Bean:表明这个方法是一个 bean 的定义,缺省情况下,方法名称就是 bean 的 Id

  ● @Autowired:这个 datasource 采用自动注入的方式获取

  注意,我们采用的是 XML+config bean 的方式进行配置,这种方式比较符合实际项目的情况。相关的 Spring 配置文件也要做变化,如下清单所示:

  清单 9. Spring-db2.xml

  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.    
  12. http://www.Springframework.org/schema/context/Spring-context-3.0.xsd"> 
  13.    
  14.  <context:annotation-config/> 
  15.  <bean id="datasource" 
  16. > 
  17.          <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> 
  18.          <property name="url" value="jdbc:hsqldb:hsql://localhost" /> 
  19.          <property name="username" value="sa"/> 
  20.          <property name="password" value=""/> 
  21.      </bean> 
  22.  <bean id="transactionManager" 
  23.          > 
  24.          <property name="dataSource" ref="datasource"></property> 
  25.      </bean> 
  26.    
  27.      <bean/> 
  28.  </beans>

  注意里面的 context 命名空间的定义,如代码中黑体字所示。另外还必须有 <context:annotaiton-config/> 的定义,这个定义允许采用注释标签的方式来控制 Spring 的容器,最后我们看到 beans 已经没有 initer、accountDao 和 accountService 这些 bean 的定义,取而代之的是一个 SpringDb2Config bean 的定义,注意这个 bean 没有名称,因为不需要被引用。

  现在有了这些配置,我们的测试类只要稍稍修改一下,即可实现加载配置类的效果,如下:

@ContextConfiguration("/config/Spring-db2.xml")

  通过上面的配置,测试用例就可以实现加载 Spring 配置类,运行结果也是成功的 green bar。

  @DirtiesContext

  缺省情况下,Spring 测试框架一旦加载 applicationContext 后,将一直缓存,不会改变,但是,

  由于 Spring 允许在运行期修改 applicationContext 的定义,例如在运行期获取 applicationContext,然后调用 registerSingleton 方法来动态的注册新的 bean,这样的情况下,如果我们还使用 Spring 测试框架的被修改过 applicationContext,则会带来测试问题,我们必须能够在运行期重新加载 applicationContext,这个时候,我们可以在测试类或者方法上注释:@DirtiesContext,作用如下:

  ● 如果定义在类上(缺省),则在此测试类运行完成后,重新加载 applicationContext

  ● 如果定义在方法上,即表示测试方法运行完成后,重新加载 applicationContext

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号