`
zzc1684
  • 浏览: 1190371 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Spring4.1新特性——数据库集成测试

阅读更多

目录

Spring4.1新特性——综述

Spring4.1新特性——Spring核心部分及其他

Spring4.1新特性——Spring缓存框架增强

Spring4.1新特性——异步调用和事件机制的异常处理

Spring4.1新特性——数据库集成测试脚本初始化

Spring4.1新特性——Spring MVC增强

Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介

Spring4.1新特性——静态资源处理增强

 

 

在Spring 4.1之前我们在准备测试数据时可能通过继承AbstractTransactionalJUnit4SpringContextTests,然后调用 executeSqlScript()进行测试,其中存在一个主要问题:如果要同时执行多个数据源的初始化就靠不住了,而且使用起来也不是特别便 利,Spring4.1提供了@Sql注解来完成这个任务。

 

1、初始化Spring配置: 

Java代码  收藏代码
  1. <jdbc:embedded-database id="dataSource1" type="HSQL"/>  
  2. <jdbc:embedded-database id="dataSource2" type="HSQL"/>  
  3.   
  4. <bean id="txManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  5.     <property name="dataSource" ref="dataSource1"/>  
  6. </bean>  
  7.   
  8. <bean id="txManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  9.     <property name="dataSource" ref="dataSource2"/>  
  10. </bean>  

此处使用jdbc:embedded嵌入数据库来完成测试,数据库使用HSQL。

 

2、 方法级别的@Sql

Java代码  收藏代码
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @FixMethodOrder(MethodSorters.NAME_ASCENDING)  
  3. @ContextConfiguration(value = "classpath:spring-datasource.xml")  
  4. @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)  
  5. public class MethodLevelSqlTest {  
  6.     private JdbcTemplate jdbcTemplate1;  
  7.     private JdbcTemplate jdbcTemplate2;  
  8.     @Autowired  
  9.     @Qualifier("dataSource1")  
  10.     public void setDataSource1(DataSource dataSource1) {  
  11.         this.jdbcTemplate1 = new JdbcTemplate(dataSource1);  
  12.     }  
  13.     @Autowired  
  14.     @Qualifier("dataSource2")  
  15.     public void setDataSource2(DataSource dataSource2) {  
  16.         this.jdbcTemplate2 = new JdbcTemplate(dataSource2);  
  17.     }  
  18.   
  19.   
  20.     @Test  
  21.     @Sql(value = {"classpath:schema.sql""classpath:init-data.sql""classpath:updated-data.sql"},  
  22.             config =  
  23.             @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",  
  24.                     dataSource = "dataSource1", transactionManager = "txManager1"))  
  25.     public void test01_simple() {  
  26.         Assert.assertEquals(  
  27.                 Integer.valueOf(3),  
  28.                 jdbcTemplate1.queryForObject("select count(1) from users", Integer.class));  
  29.     }  
  30.   
  31.   
  32.     @Test  
  33.     @Sql(value = {"classpath:schema.sql""classpath:init-data.sql"},  
  34.             config =  
  35.             @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",  
  36.                     dataSource = "dataSource2", transactionManager = "txManager2"))  
  37.     public void test02_simple() {  
  38.         Assert.assertEquals(  
  39.                 Integer.valueOf(2),  
  40.                 jdbcTemplate2.queryForObject("select count(1) from users", Integer.class));  
  41.     }  
  42.   
  43. }  

方法级别的@Sql在每个方法上都会执行。其中@Sql可以指定多个sql文件,然后通过@SqlConfig指定其编码、分隔符、注释前缀、使用哪个数据源和事务管理器。

 

 

3、类级别的@Sql

Java代码  收藏代码
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @FixMethodOrder(MethodSorters.NAME_ASCENDING)  
  3. @ContextConfiguration(value = "classpath:spring-datasource.xml")  
  4. @Sql(value = {"classpath:schema.sql""classpath:init-data.sql""classpath:updated-data.sql"},  
  5.         config =  
  6.         @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",  
  7.                 dataSource = "dataSource1", transactionManager = "txManager1"))  
  8. @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)  
  9. public class ClassLevelSqlTest {  
  10.   
  11.     private JdbcTemplate jdbcTemplate1;  
  12.     @Autowired  
  13.     @Qualifier("dataSource1")  
  14.     public void setDataSource1(DataSource dataSource1) {  
  15.         this.jdbcTemplate1 = new JdbcTemplate(dataSource1);  
  16.     }  
  17.   
  18.     @Test  
  19.     public void test01_simple() {  
  20.         Assert.assertEquals(  
  21.                 Integer.valueOf(3),  
  22.                 jdbcTemplate1.queryForObject("select count(1) from users", Integer.class));  
  23.     }  
  24. }  

类级别的对整个测试用例中的每个方法都起作用。 

 

4、指定多个@Sql 

Java8之前需要使用@SqlGroup,而Java8之后直接使用多个@Sql注解即可。

Java代码  收藏代码
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @FixMethodOrder(MethodSorters.NAME_ASCENDING)  
  3. @ContextConfiguration(value = "classpath:spring-datasource.xml")  
  4. @Transactional()  
  5. @SqlGroup(  
  6.         {  
  7.                 @Sql(value = {"classpath:schema.sql""classpath:init-data.sql""classpath:updated-data.sql"},  
  8.                         config =  
  9.                         @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",  
  10.                                 dataSource = "dataSource1", transactionManager = "txManager1")),  
  11.                 @Sql(value = {"classpath:schema.sql""classpath:init-data.sql"},  
  12.                         config =  
  13.                         @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",  
  14.                                 dataSource = "dataSource2", transactionManager = "txManager2"))  
  15.         }  
  16. )  
  17.   
  18. @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)  
  19. public class ClassLevelSqlGroupTest {  
  20.   
  21.     private JdbcTemplate jdbcTemplate1;  
  22.     private JdbcTemplate jdbcTemplate2;  
  23.     @Autowired  
  24.     @Qualifier("dataSource1")  
  25.     public void setDataSource1(DataSource dataSource1) {  
  26.         this.jdbcTemplate1 = new JdbcTemplate(dataSource1);  
  27.     }  
  28.     @Autowired  
  29.     @Qualifier("dataSource2")  
  30.     public void setDataSource2(DataSource dataSource2) {  
  31.         this.jdbcTemplate2 = new JdbcTemplate(dataSource2);  
  32.     }  
  33.   
  34.   
  35.     @Test  
  36.     @Transactional()  
  37.     @Sql(value = {"classpath:schema.sql""classpath:init-data.sql""classpath:updated-data.sql"},  
  38.             config =  
  39.             @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",  
  40.                     dataSource = "dataSource1", transactionManager = "txManager1"))  
  41.     public void test01_simple() {  
  42.         Assert.assertEquals(  
  43.                 Integer.valueOf(3),  
  44.                 jdbcTemplate1.queryForObject("select count(1) from users", Integer.class));  
  45.     }  
  46.   
  47.   
  48.     @Test  
  49.     @Transactional()  
  50.     @Sql(value = {"classpath:schema.sql""classpath:init-data.sql"},  
  51.             config =  
  52.             @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",  
  53.                     dataSource = "dataSource2", transactionManager = "txManager2"))  
  54.     public void test02_simple() {  
  55.         Assert.assertEquals(  
  56.                 Integer.valueOf(2),  
  57.                 jdbcTemplate2.queryForObject("select count(1) from users", Integer.class));  
  58.     }  
  59.   
  60. }  

 

也可以通过元注解把注解合并:

Java代码  收藏代码
  1. @SqlGroup(  
  2.         {  
  3.                 @Sql(value = {"classpath:schema.sql""classpath:init-data.sql""classpath:updated-data.sql"},  
  4.                         config =  
  5.                         @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",  
  6.                                 dataSource = "dataSource1", transactionManager = "txManager1")),  
  7.                 @Sql(value = {"classpath:schema.sql""classpath:init-data.sql"},  
  8.                         config =  
  9.                         @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",  
  10.                                 dataSource = "dataSource2", transactionManager = "txManager2"))  
  11.         }  
  12. )  
  13. @Retention(RUNTIME)  
  14. @Target(TYPE)  
  15. @interface CompositeSqlGroup {  
  16. }  

直接使用@CompositeSqlGroup注解即可。

 

5、事务

Java代码  收藏代码
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @FixMethodOrder(MethodSorters.NAME_ASCENDING)  
  3. @ContextConfiguration(value = "classpath:spring-datasource.xml")  
  4. @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)  
  5. public class TransactionalTest {  
  6.     private JdbcTemplate jdbcTemplate1;  
  7.     private JdbcTemplate jdbcTemplate2;  
  8.     @Autowired  
  9.     @Qualifier("dataSource1")  
  10.     public void setDataSource1(DataSource dataSource1) {  
  11.         this.jdbcTemplate1 = new JdbcTemplate(dataSource1);  
  12.     }  
  13.     @Autowired  
  14.     @Qualifier("dataSource2")  
  15.     public void setDataSource2(DataSource dataSource2) {  
  16.         this.jdbcTemplate2 = new JdbcTemplate(dataSource2);  
  17.     }  
  18.   
  19.   
  20.     @Test  
  21.     @Transactional("txManager1")  
  22.     @Sql(value = {"classpath:schema.sql""classpath:init-data.sql""classpath:updated-data.sql"},  
  23.             config =  
  24.             @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",  
  25.                     dataSource = "dataSource1", transactionManager = "txManager1"))  
  26.     public void test01_simple() {  
  27.         //判断是在事务中执行  
  28.         Assert.assertTrue(TransactionSynchronizationManager.isActualTransactionActive());  
  29.         Assert.assertTrue(TestTransaction.isActive());  
  30.         Assert.assertEquals(  
  31.                 Integer.valueOf(3),  
  32.                 jdbcTemplate1.queryForObject("select count(1) from users", Integer.class));  
  33.     }  
  34.   
  35.   
  36.     @Test  
  37.     @Transactional("txManager2")  
  38.     @Sql(value = {"classpath:schema.sql""classpath:init-data.sql"},  
  39.             config =  
  40.             @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",  
  41.                     dataSource = "dataSource2", transactionManager = "txManager2"))  
  42.     public void test02_simple() {  
  43.         Assert.assertEquals(  
  44.                 Integer.valueOf(2),  
  45.                 jdbcTemplate2.queryForObject("select count(1) from users", Integer.class));  
  46.     }  
  47.   
  48.   
  49.     @Test  
  50.     @Transactional("txManager2")  
  51.     @Sql(value = {"classpath:schema.sql""classpath:init-data.sql"},  
  52.             config =  
  53.             @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",  
  54.                     dataSource = "dataSource2", transactionManager = "txManager2"))  
  55.     public void test03_simple() {  
  56.         Assert.assertEquals(  
  57.                 Integer.valueOf(2),  
  58.                 jdbcTemplate2.queryForObject("select count(1) from users", Integer.class));  
  59.         TestTransaction.flagForRollback();  
  60.     }  
  61.   
  62.     @Rule  
  63.     public TestName testName = new TestName();  
  64.     @AfterTransaction  
  65.     public void afterTransaction() {  
  66.         System.out.println(testName.getMethodName());  
  67.         if("test03_simple".equals(testName.getMethodName())) {  
  68.             Assert.assertEquals(  
  69.                     Integer.valueOf(0),  
  70.                     jdbcTemplate2.queryForObject("select count(1) from users", Integer.class));  
  71.         }  
  72.     }  
  73. }  

可以使用//判断是在事务中执行 TransactionSynchronizationManager.isActualTransactionActive()或 TestTransaction.isActive()来判断是否是在事务中执行;通过 TestTransaction.flagForRollback();来回滚事务;在测试用例中@AfterTransaction来断言回滚后数据没 有插入。

 

相关文章

Spring事务不起作用 问题汇总 

如何测试REQUIRES_NEW事务

 

Spring4新特性

Spring4新特性——泛型限定式依赖注入

Spring4新特性——核心容器的其他改进

Spring4新特性——Web开发的增强

Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC 

Spring4新特性——Groovy Bean定义DSL

Spring4新特性——更好的Java泛型操作API 

Spring4新特性——JSR310日期API的支持

Spring4新特性——注解、脚本、任务、MVC等其他特性改进 

          

源码下载

https://github.com/zhangkaitao/spring4-1-showcase/tree/master/spring4.1-dbtest

分享到:
评论

相关推荐

    Spring.3.x企业应用开发实战(完整版).part2

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    Spring3.x企业应用开发实战(完整版) part1

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 Spring MVC 基本配置 87 4.4.1 静态资源映射 88 4.4.2 拦截器...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 Spring MVC 基本配置 87 4.4.1 静态资源映射 88 4.4.2 拦截器...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 Spring MVC 基本配置 87 4.4.1 静态资源映射 88 4.4.2 拦截器...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    ——数据库应用开发 7.1 本章学习任务 7.1.1 本章知识体系. 7.1.2 实例开发任务 7.2 My SQL数据库的安装与使用 7.2.1 安装并配置MyS QL 7.2.2 安装MySQLGUITool 7.2.3 连接MySQLAdministrator. 7.2.4 创建数据库 ...

    领域驱动设计与模式实战

    4.1 新的默认架构的基础知识 4.1.1 从以数据库为中心过渡到以领域模型为中心 4.1.2 进一步关注DDD 4.1.3 根据DDD进行分层 4.2 轮廓 4.2.1 领域模型示例的问题/特性 4.2.2 逐个处理特性 4.2.3 到目前为止的领域模型 ...

    JAVA程序开发大全---上半部分

    第5章 Java开发项目的软件测试工具——JUnit 68 5.1 软件测试简介 68 5.2 JUnit简介 68 5.2.1 JUnit的特点 69 5.2.2 JUnit的常用类和接口 69 5.3 在MyEclipse中设置JUnit 71 5.4 JUnit测试 72 5.4.1 JUnit测试用例 ...

    Grails权威指南

     4.1 简化的orm和grails对象关系映射(gorm)  4.2 gorm基础  4.3 设置属性可选  4.4 gorm中的关系  4.5 执行crud操作  4.5.1 创建书签  4.5.2 读取书签  4.5.3 更新书签  4.5.4 ...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

     SQL Server 2000与以前版本相比较,又具有以下新特性 :  1.支持XML(Extensive Markup Language,扩展标记语言)  2.强大的基于Web的分析  3.支持OLE DB和多种查询  4.支持分布式的分区视图  安装、...

    JBPM4工作流应用开始指南.rar

    jBPM4与Spring框架集成 296 18.1 集成的目标 297 18.2 为集成配置jBPM4 297 18.3 为集成配置Spring 299 18.4 使用 301 18.5 测试 302 18.6 小结 302 第19章 jBPM4与JBoss应用服务器集成 303 19.1 流程定义打包部署 ...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    SSH 为 Struts+Spring+Hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久...

Global site tag (gtag.js) - Google Analytics