- 浏览: 216236 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (166)
- Hibernate (3)
- Spring (18)
- Struts (1)
- Grails (0)
- Tools (17)
- j2se (17)
- webservice (3)
- js (5)
- XML (5)
- apache (6)
- JavaWeb (2)
- oracle (5)
- plan (12)
- linux (5)
- FreeMarker (3)
- maven (5)
- Activiti (4)
- log4jdbc (1)
- self4j (1)
- log4j (1)
- j2ee (1)
- shiro (2)
- MySQL (4)
- reflect (2)
- cmd (1)
- DB (6)
- report (1)
- jQuery (1)
- Cache (4)
- MQ (2)
- NIO (1)
- SCM (1)
- Framework (2)
- computer (2)
- MyBatis (1)
- cluster (1)
- solr (13)
- ZooKeeper (1)
- SVN (1)
- http (0)
- websocket (1)
- Tomcat (2)
- Spring Remote (2)
- Android (1)
- dubbo (1)
最新评论
-
whuvr:
import com.capitalbio.soft.core ...
Jedis+SpringDataRedis+Spring -
tianlanxing:
方法 不对 博主赶紧删了
SpringMVC中获取request与response对象 -
xiaoliu128:
汗。写了一大堆,没看出来是怎么数据库配置权限
shiro拦截url动态配置在数据库 -
javajiangyijin:
你好!按照你说的这样,/** 获取HttpServletRes ...
SpringMVC中获取request与response对象 -
虎踞龙盘忆江南:
你有个地方写的有点问题! appPat ...
Web项目的自定义属性配置文件读取- Windows/Linux
一、使用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");
参阅: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");
发表评论
-
SpringMVC @InitBinder webBindingInitializer
2015-07-06 15:22 12031: 注册Controller内的Binder: ... -
SpringAOP简单用例
2015-05-21 15:57 4631:Spring配置: <aop:config&g ... -
SpringMVC之配置用于@ResponseBody的HttpMessageConverter转换器
2015-01-09 10:38 3521<!-- 自动扫描且只扫描@Controller - ... -
SpringMVC之配置内容类型协商管理器
2014-12-31 16:18 623当不希望使用 SpringMVC根据 文件后缀来决定文件类 ... -
SpringMVC Freemarker 自定义标签
2014-12-10 18:07 17721:实现 freemarker.template.Temp ... -
Spring FactoryBean 使用
2014-11-27 14:18 520Spring FactoryBean 使用 Entity ... -
spring xsd usage
2014-10-14 15:54 431http://docs.spring.io/spring- ... -
Spring Hessian
2014-08-15 19:35 5161:服务器端pom.xml <dependency ... -
DelegatingFilterProxy - Spring
2014-08-07 16:01 415参考: http://docs.spring.io/sp ... -
Spring - 属性文件属性注入
2013-04-25 09:54 805在applicationContext.xml中加入: 1 ... -
shiro拦截url动态配置在数据库
2013-03-28 20:34 17427核心思想: 1:对 org.apache.shiro.w ... -
JCaptcha-SpringMVC集成
2013-03-25 11:15 2033GMail验证码样式的图片引擎: import ja ... -
Spring3.x + Hibernate4.x 升级注意事项
2013-03-19 13:23 86041: 启动服务器发现报:: Caused by: java ... -
SpringMVC中获取request与response对象
2013-03-18 19:20 54011:使用 注解 @Autowired private H ... -
Spring-JDBC/ORM 统一事务管理解决方案
2013-03-16 19:43 2710若使用 MyBatis[JDBC] 与hibernate[ ... -
使用静态变量缓存ApplicationContext
2012-05-09 16:08 5103第一种方法: 1: 声明如下类: package c ... -
Spring2.5 + Junit测试
2011-06-02 17:07 537要求: JDK1.5以上(因为Junit4是用注 ...
相关推荐
首先,Spring TestContext框架的核心是`@ContextConfiguration`注解,它用于指定测试类中应用上下文的配置。你可以通过此注解提供XML配置文件的位置,或者使用Java配置类。例如: ```java import org.spring...
- 虽然Spock框架在Spring 2.5之后才逐渐流行,但通过适配器,也可以与Spring TestContext框架一起使用,提供更丰富的测试语法和功能。 9. **Web应用程序测试**: - Spring 2.5 TestContext框架也支持Web应用程序...
5. **测试**:创建一个JUnit测试类,使用Spring的TestContext框架来加载配置并运行测试。确保你的测试类继承了`AbstractJUnit4SpringContextTests`或`AbstractTestNGSpringContextTests`(取决于你使用的测试框架)...
TestContext框架是Spring测试支持的一部分,它提供了一个统一的测试上下文,可以加载Spring配置,并为测试注入依赖。以下是对Spring测试框架及其核心组件的详细说明: 1. **测试注解**:Spring测试框架利用注解简化...
10. **单元测试和集成测试支持**:Spring提供了TestContext框架,使得编写和运行单元测试以及集成测试变得简单。 通过阅读这本中文参考手册,开发者可以深入了解Spring 2.5的各种功能,掌握如何使用Spring构建高...
Spring 2.5提供了一套完整的测试框架,包括单元测试和集成测试工具,如MockMVC和TestContext框架,使得测试Spring应用变得更加便捷。 9. **Web服务支持** Spring 2.5加强了对Web服务的支持,包括SOAP和RESTful...
10. **测试支持**:Spring 2.5 强化了测试框架,包括 `MockMVC` 和 `TestContext` 框架,使得单元测试和集成测试更加方便。 以上是 Spring 2.5 架构中的核心知识点,它们共同构建了一个强大且灵活的应用开发框架,...
在《Spring 2.5 开发手册》中,会详细解释这些特性的使用方法、配置细节以及最佳实践,帮助开发者充分利用Spring框架,构建稳定、高效的应用系统。通过阅读这份手册,开发者可以深入理解Spring 2.5的工作原理,提升...
Spring 2.5增强了测试支持,提供了TestContext框架,支持集成测试,包括对Spring配置的加载、事务管理、模拟对象等。 **国际化** Spring提供了对国际化的支持,通过MessageSource接口可以方便地实现多语言环境下的...
8. **单元测试与集成测试支持**:Spring提供TestContext框架,支持Junit、Mockito等工具进行单元测试和集成测试,方便开发者编写和运行测试用例。 9. **Spring Expression Language (SpEL)**:SpEL是Spring提供的...
在测试方面,手册提供了关于单元测试和集成测试的指导,包括使用JUnit、Mockito等工具,以及Spring的TestContext框架,帮助开发者编写高质量的测试代码,确保软件的稳定性和可靠性。 最后,手册还包含了一些最佳...
10. **测试支持**:Spring 2.5提供了全面的测试工具和API,如`Spring TestContext Framework`,使得单元测试和集成测试变得更加容易。 了解并熟练运用上述知识点,对于初学者来说,是快速掌握Spring框架的关键。...
9. **集成测试**:Spring 2.5提供了方便的测试支持,如TestContext框架,使得集成测试变得简单。它允许在测试环境中轻松地加载ApplicationContext,并支持模拟bean和交易管理。 10. **Portlet MVC**:除了传统的Web...
8. **单元测试与集成测试**:Spring提供了强大的测试支持,包括Mock对象、TestContext框架等,使得开发者能够编写高效的单元测试和集成测试。 9. **Spring Web Services**:2.5版本还支持创建和消费Web服务,包括...
9. **测试支持**:Spring提供了一系列测试工具和API,方便进行单元测试和集成测试,包括Mock对象和TestContext框架。 10. **Spring Batch**:对于批量处理任务,Spring Batch提供了一套完整的解决方案,包括读取、...
8. **测试支持**:Spring提供了一套完整的测试框架,包括Mock对象、TestContext框架等,方便进行单元测试和集成测试。 9. **国际化(Internationalization,i18n)**:Spring通过MessageSource接口支持多语言环境,...
9. **集成测试**:Spring 2.5提供了更全面的测试支持,包括Mock对象、TestContext框架和`@RunWith(SpringJUnit4ClassRunner.class)`注解,便于进行单元测试和集成测试。 10. **国际化支持**:Spring 2.5加强了对...
使用 Spring 2.5 TestContext 测试框架编写测试用例的基本步骤如下: 1. **导入必要的依赖**:首先确保项目中包含 Spring 测试模块的相关依赖。 2. **定义测试类**:测试类通常需要继承自 `...