`

使用Spring2.5 TestContext框架

阅读更多
一、使用Spring2.5 TestContext框架

参阅:http://www.ibm.com/developerworks/cn/java/j-lo-spring25-test/

       Spring 2.5 TestContext 测试框架,是一个全新的基于注解的测试框架,为 Spring 推荐使用该测试框架。

       Spring 2.5 相比于 Spring 2.0 所新增的最重要的功能可以归结为以下 3 点:

(1)基于注解的 IoC 功能;

(2)基于注解驱动的 Spring MVC 功能;

(3)基于注解的 TestContext 测试框架。

Spring 推荐开发者使用新的基于注解的 TestContext 测试框架。



1、一个需要测试的 Spring 服务类(测试需求)

在用户登录成功后调用 UserService 中的 handleUserLogin() 方法执行用户登录成功后的业务逻辑:

(1)登录用户添加 5 个积分(t_user.credits);

(2)登录用户的最后访问时间(t_user.last_visit)和 IP(t_user.last_ip)更新为当前值;

(3)在日志表中(t_login_log)中为用户添加一条登录日志。

这是一个需要访问数据库并存在数据更改操作的业务方法,它工作在事务环境下。

2、编写 UserService 的测试用例

(1)TestUserService继承AbstractTransactionalJUnit4SpringContextTests。

(2)标注一个类级的 @ContextConfiguration 注解。TestUserService-context.xml 的 Spring 默认配置文件。@ContextConfiguration两个常用的属性:locations:inheritLocations。

(3)属性 @Autowired 注解。让 Spring 容器自动注入 UserService 类型的 Bean。

(4)测试方法@Test 注解。@Test 是 JUnit 4.4 所定义的注解。

TestUserService-context.xml 配置文件的内容:

<import resource="classpath:/applicationContext.xml"/>

3、准备测试数据并检测运行结果

(1)准备测试数据

使用 JUnit 4.4 的 @Before 注解达到这个目的。

在 Spring TestContext 中,标注 @Before 和 @After 的方法会在测试用例中每个测试方法运行前后执行,并和测试方法运行于同一个事务中。由于测试方法运行后,整个事务会被回滚,在@Before中插入的测试数据也不会持久化到数据库中,因此我们无须手工删除这条记录。

要不在同一个事务中,保存准备数据。使用 Spring TestContext 的 @BeforeTransaction 和 @AfterTransaction 注解来达到目的。

可以显式地通过 @NotTransactional 注解,让测试方法不工作于事务环境下。

准备测试数据时,常使用的对象(在 AbstractTransactionalJUnit4SpringContextTests 抽象类中定义):只要 Spring 容器有配置数据源,simpleJdbcTemplate 就会被自动创建。同时该抽象类中还拥有一个 Spring 容器引用:applicationContext,你可以借助该成员变量访问 Spring 容器,执行获取 Bean,发布事件等操作。

此外,AbstractTransactionalJUnit4SpringContextTests 还提供了若干个访问数据库的便捷方法,说明如下:

protected int countRowsInTable(String tableName) :计算数据表的记录数。

protected int deleteFromTables(String... names):删除表中的记录,可以指定多张表。

protected void executeSqlScript(String sqlResourcePath, boolean continueOnError):执行 SQL 脚本文件,在脚本文件中,其格式必须一个 SQL 语句一行。



(2)检验业务逻辑的正确性

没有在业务方法执行后检查执行结果的正确性,测试是不到位的。也就是说,我们必须访问数据库以检查业务方法对数据更改是否成功:这包括积分(credits)、最后登录时间(last_visit)、最后登录 IP(last_ip)以及登录日志表中的登录日志记录(t_login_log)。

注意:由于我们的 DAO 层采用 Spring JDBC 框架,它没有采用服务层缓存技术,所以可以使用 DAO 类返回数据库中的数据。如果采用 Hibernate 等 ORM 框架,由于它们采用了服务层缓存的技术,为了获取数据库中的相应数据,需要在业务方法执行后调用 HibernateTemplate.flush() 方法,将缓存中的对象同步到数据库中,这时才可以通过 SimpleJdbcTemplate 在数据库中访问业务方法的执行情况。



二、利用spring2.0来进行集成测试

参阅:http://wiki.springside.org.cn/display/springside/SpringUnitTest

       http://www.redsaga.com/spring_ref/2.0RC2/html/testing.html

Spring下单元测试的要点

1. 需要Spring 依赖注入的测试

为了测试Spring管理下的Bean,可以自行构造BeanFactory,也可以继承于AbstractDependencyInjectionSpringContextTests,实现public String[] getConfigLocations()函数, 返回applicationContext文件路径的数组。

protected String[] getConfigLocations() {

return new String[]{"classpath*:spring/*.xml",  "classpath*:spring/test/*.xml"};

}

并显式写一些需要注入的变量的setter函数。

tips1:此基类有一个applicationContext的成员变量,所以除了依靠setter注入外,还可以随时用applicationContext.getBean(String beanName) 取出所需的bean。

2. Dao测试

AbstractTransactionalDataSourceSpringContextTests继承于AbstractDependencyInjectionSpringContextTests,除了拥有上类的能力外,还管理了每个测试的事务,会Open Session In Test,还会在每个测试后默认回滚所有的操作。

tips1:如果需要在测试后提交,需要setRollBack(false); 或者调用setComplete(); 注意如果没有提交,hibernate这样奸诈的Framework就不会去实际操作数据库,降低了测试的效果。

3. Controller测试

Controller测试一般要用MockObject 分离Service层,要copy WEB-INF/下的相关文件copy 到classpath,而且Controller不含太多的逻辑,所有测试controller有点吃力不讨好,建议直接用Selenium进行集成测试,见(Selenium测试概述)。



相关API:

1、AbstractSpringContextTests类[1],该类全部方法是protected的,主要用于子类重写。

2、AbstractDependencyInjectionSpringContextTests类[2]:继承于类[1]:名字N长的。如果仅仅使用Spring依赖注入功能,可以让测试用例继承该类。

3、AbstractTransactionalSpringContextTests类[3]:继承于类[2],继承该类的测试用例在spring管理的事务中进行,测试完后对数据库的记录不会造成任何影响。

4、AbstractTransactionalDataSourceSpringContextTests:继承于类[3],功能更强大,用于测试持久层组件,看其源代码,有一行"protected JdbcTemplate jdbcTemplate;",提供了一个JdbcTemplate的变量,通过该对象可以直接操作数据库。


三、利用spring的mock类进行单元测试

spring框架提供了大量测试的mock类,包括与jndi,porlet,web应用相关的mock类。尤其是web应用相关的mock类,可以大大提高web组件测试的方便性。

打开spring的下载包的mock文件夹(路径...mock\org\springframework\mock\web),就发觉有如下几个文件:

MockHttpServletRequest:是HttpServletRequest接口的mock实现,用来模拟客户端的HTTP请求,很常用的一个类。

MockHttpServletResponse:是HttpServletResponse接口的mock实现,用于模拟服务器对客户端的响应。

MockHttpSession:是对HttpSession接口的mock实现。

DelegatingServletInputStream:是对ServletInputStream接口的mock实现。

DelegatingServletOutputStream:ServletOutputStream的mock实现。需要拦截和分析服务器的输出的流的内容,可以使用该类。

其他的,例如MockFilterConfig,MockPageContext(可以测试预编译的 JSP),MockRequestDispatcher,MockServletConfig看名称就知道大概是mock什么的。

举一个例子: Java代码

MockHttpServletRequest request =  new MockHttpServletRequest("POST","/index.do");  

request.addParameter("username","name");  

request.addParameter("password","word"); 
分享到:
评论

相关推荐

    使用 Spring 2.5 TestContext 测试框架

    首先,Spring TestContext框架的核心是`@ContextConfiguration`注解,它用于指定测试类中应用上下文的配置。你可以通过此注解提供XML配置文件的位置,或者使用Java配置类。例如: ```java import org.spring...

    Spring 2.5 TestContext

    - 虽然Spock框架在Spring 2.5之后才逐渐流行,但通过适配器,也可以与Spring TestContext框架一起使用,提供更丰富的测试语法和功能。 9. **Web应用程序测试**: - Spring 2.5 TestContext框架也支持Web应用程序...

    eclipse搭建spring2.5

    5. **测试**:创建一个JUnit测试类,使用Spring的TestContext框架来加载配置并运行测试。确保你的测试类继承了`AbstractJUnit4SpringContextTests`或`AbstractTestNGSpringContextTests`(取决于你使用的测试框架)...

    Spring测试框架.rar

    TestContext框架是Spring测试支持的一部分,它提供了一个统一的测试上下文,可以加载Spring配置,并为测试注入依赖。以下是对Spring测试框架及其核心组件的详细说明: 1. **测试注解**:Spring测试框架利用注解简化...

    spring2.5 中文参考手册

    10. **单元测试和集成测试支持**:Spring提供了TestContext框架,使得编写和运行单元测试以及集成测试变得简单。 通过阅读这本中文参考手册,开发者可以深入了解Spring 2.5的各种功能,掌握如何使用Spring构建高...

    传智播客spring2.5 ppt

    Spring 2.5提供了一套完整的测试框架,包括单元测试和集成测试工具,如MockMVC和TestContext框架,使得测试Spring应用变得更加便捷。 9. **Web服务支持** Spring 2.5加强了对Web服务的支持,包括SOAP和RESTful...

    Spring2.5架构图

    10. **测试支持**:Spring 2.5 强化了测试框架,包括 `MockMVC` 和 `TestContext` 框架,使得单元测试和集成测试更加方便。 以上是 Spring 2.5 架构中的核心知识点,它们共同构建了一个强大且灵活的应用开发框架,...

    spring 2.5开发手册

    在《Spring 2.5 开发手册》中,会详细解释这些特性的使用方法、配置细节以及最佳实践,帮助开发者充分利用Spring框架,构建稳定、高效的应用系统。通过阅读这份手册,开发者可以深入理解Spring 2.5的工作原理,提升...

    Spring2.5开发简明教程中文版

    Spring 2.5增强了测试支持,提供了TestContext框架,支持集成测试,包括对Spring配置的加载、事务管理、模拟对象等。 **国际化** Spring提供了对国际化的支持,通过MessageSource接口可以方便地实现多语言环境下的...

    Spring2.5-中文参考手册

    8. **单元测试与集成测试支持**:Spring提供TestContext框架,支持Junit、Mockito等工具进行单元测试和集成测试,方便开发者编写和运行测试用例。 9. **Spring Expression Language (SpEL)**:SpEL是Spring提供的...

    Spring 2.5 开发手册

    在测试方面,手册提供了关于单元测试和集成测试的指导,包括使用JUnit、Mockito等工具,以及Spring的TestContext框架,帮助开发者编写高质量的测试代码,确保软件的稳定性和可靠性。 最后,手册还包含了一些最佳...

    spring2.5 api 完全参考手册chm api

    10. **测试支持**:Spring 2.5提供了全面的测试工具和API,如`Spring TestContext Framework`,使得单元测试和集成测试变得更加容易。 了解并熟练运用上述知识点,对于初学者来说,是快速掌握Spring框架的关键。...

    springframework2.5源代码

    9. **集成测试**:Spring 2.5提供了方便的测试支持,如TestContext框架,使得集成测试变得简单。它允许在测试环境中轻松地加载ApplicationContext,并支持模拟bean和交易管理。 10. **Portlet MVC**:除了传统的Web...

    pro spring 2.5

    8. **单元测试与集成测试**:Spring提供了强大的测试支持,包括Mock对象、TestContext框架等,使得开发者能够编写高效的单元测试和集成测试。 9. **Spring Web Services**:2.5版本还支持创建和消费Web服务,包括...

    string 帮助手册(spring2.5)

    9. **测试支持**:Spring提供了一系列测试工具和API,方便进行单元测试和集成测试,包括Mock对象和TestContext框架。 10. **Spring Batch**:对于批量处理任务,Spring Batch提供了一套完整的解决方案,包括读取、...

    Spring Reference 2.5 中文

    8. **测试支持**:Spring提供了一套完整的测试框架,包括Mock对象、TestContext框架等,方便进行单元测试和集成测试。 9. **国际化(Internationalization,i18n)**:Spring通过MessageSource接口支持多语言环境,...

    spring源代码2.5

    9. **集成测试**:Spring 2.5提供了更全面的测试支持,包括Mock对象、TestContext框架和`@RunWith(SpringJUnit4ClassRunner.class)`注解,便于进行单元测试和集成测试。 10. **国际化支持**:Spring 2.5加强了对...

    Spring+hibernate 单元测试

    使用 Spring 2.5 TestContext 测试框架编写测试用例的基本步骤如下: 1. **导入必要的依赖**:首先确保项目中包含 Spring 测试模块的相关依赖。 2. **定义测试类**:测试类通常需要继承自 `...

Global site tag (gtag.js) - Google Analytics