`
jinnianshilongnian
  • 浏览: 21512427 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2420243
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3010025
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5640436
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:260206
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597846
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250358
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5860322
Group-logo
跟我学Nginx+Lua开...
浏览量:702797
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:785668
社区版块
存档分类
最新评论

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配置: 

    <jdbc:embedded-database id="dataSource1" type="HSQL"/>
    <jdbc:embedded-database id="dataSource2" type="HSQL"/>

    <bean id="txManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource1"/>
    </bean>

    <bean id="txManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource2"/>
    </bean>

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

 

2、 方法级别的@Sql

@RunWith(SpringJUnit4ClassRunner.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@ContextConfiguration(value = "classpath:spring-datasource.xml")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class MethodLevelSqlTest {
    private JdbcTemplate jdbcTemplate1;
    private JdbcTemplate jdbcTemplate2;
    @Autowired
    @Qualifier("dataSource1")
    public void setDataSource1(DataSource dataSource1) {
        this.jdbcTemplate1 = new JdbcTemplate(dataSource1);
    }
    @Autowired
    @Qualifier("dataSource2")
    public void setDataSource2(DataSource dataSource2) {
        this.jdbcTemplate2 = new JdbcTemplate(dataSource2);
    }


    @Test
    @Sql(value = {"classpath:schema.sql", "classpath:init-data.sql", "classpath:updated-data.sql"},
            config =
            @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",
                    dataSource = "dataSource1", transactionManager = "txManager1"))
    public void test01_simple() {
        Assert.assertEquals(
                Integer.valueOf(3),
                jdbcTemplate1.queryForObject("select count(1) from users", Integer.class));
    }


    @Test
    @Sql(value = {"classpath:schema.sql", "classpath:init-data.sql"},
            config =
            @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",
                    dataSource = "dataSource2", transactionManager = "txManager2"))
    public void test02_simple() {
        Assert.assertEquals(
                Integer.valueOf(2),
                jdbcTemplate2.queryForObject("select count(1) from users", Integer.class));
    }

}

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

 

 

3、类级别的@Sql

@RunWith(SpringJUnit4ClassRunner.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@ContextConfiguration(value = "classpath:spring-datasource.xml")
@Sql(value = {"classpath:schema.sql", "classpath:init-data.sql", "classpath:updated-data.sql"},
        config =
        @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",
                dataSource = "dataSource1", transactionManager = "txManager1"))
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class ClassLevelSqlTest {

    private JdbcTemplate jdbcTemplate1;
    @Autowired
    @Qualifier("dataSource1")
    public void setDataSource1(DataSource dataSource1) {
        this.jdbcTemplate1 = new JdbcTemplate(dataSource1);
    }

    @Test
    public void test01_simple() {
        Assert.assertEquals(
                Integer.valueOf(3),
                jdbcTemplate1.queryForObject("select count(1) from users", Integer.class));
    }
}

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

 

4、指定多个@Sql 

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

@RunWith(SpringJUnit4ClassRunner.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@ContextConfiguration(value = "classpath:spring-datasource.xml")
@Transactional()
@SqlGroup(
        {
                @Sql(value = {"classpath:schema.sql", "classpath:init-data.sql", "classpath:updated-data.sql"},
                        config =
                        @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",
                                dataSource = "dataSource1", transactionManager = "txManager1")),
                @Sql(value = {"classpath:schema.sql", "classpath:init-data.sql"},
                        config =
                        @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",
                                dataSource = "dataSource2", transactionManager = "txManager2"))
        }
)

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class ClassLevelSqlGroupTest {

    private JdbcTemplate jdbcTemplate1;
    private JdbcTemplate jdbcTemplate2;
    @Autowired
    @Qualifier("dataSource1")
    public void setDataSource1(DataSource dataSource1) {
        this.jdbcTemplate1 = new JdbcTemplate(dataSource1);
    }
    @Autowired
    @Qualifier("dataSource2")
    public void setDataSource2(DataSource dataSource2) {
        this.jdbcTemplate2 = new JdbcTemplate(dataSource2);
    }


    @Test
    @Transactional()
    @Sql(value = {"classpath:schema.sql", "classpath:init-data.sql", "classpath:updated-data.sql"},
            config =
            @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",
                    dataSource = "dataSource1", transactionManager = "txManager1"))
    public void test01_simple() {
        Assert.assertEquals(
                Integer.valueOf(3),
                jdbcTemplate1.queryForObject("select count(1) from users", Integer.class));
    }


    @Test
    @Transactional()
    @Sql(value = {"classpath:schema.sql", "classpath:init-data.sql"},
            config =
            @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",
                    dataSource = "dataSource2", transactionManager = "txManager2"))
    public void test02_simple() {
        Assert.assertEquals(
                Integer.valueOf(2),
                jdbcTemplate2.queryForObject("select count(1) from users", Integer.class));
    }

}

 

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

@SqlGroup(
        {
                @Sql(value = {"classpath:schema.sql", "classpath:init-data.sql", "classpath:updated-data.sql"},
                        config =
                        @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",
                                dataSource = "dataSource1", transactionManager = "txManager1")),
                @Sql(value = {"classpath:schema.sql", "classpath:init-data.sql"},
                        config =
                        @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",
                                dataSource = "dataSource2", transactionManager = "txManager2"))
        }
)
@Retention(RUNTIME)
@Target(TYPE)
@interface CompositeSqlGroup {
}

直接使用@CompositeSqlGroup注解即可。

 

5、事务

@RunWith(SpringJUnit4ClassRunner.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@ContextConfiguration(value = "classpath:spring-datasource.xml")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class TransactionalTest {
    private JdbcTemplate jdbcTemplate1;
    private JdbcTemplate jdbcTemplate2;
    @Autowired
    @Qualifier("dataSource1")
    public void setDataSource1(DataSource dataSource1) {
        this.jdbcTemplate1 = new JdbcTemplate(dataSource1);
    }
    @Autowired
    @Qualifier("dataSource2")
    public void setDataSource2(DataSource dataSource2) {
        this.jdbcTemplate2 = new JdbcTemplate(dataSource2);
    }


    @Test
    @Transactional("txManager1")
    @Sql(value = {"classpath:schema.sql", "classpath:init-data.sql", "classpath:updated-data.sql"},
            config =
            @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",
                    dataSource = "dataSource1", transactionManager = "txManager1"))
    public void test01_simple() {
        //判断是在事务中执行
        Assert.assertTrue(TransactionSynchronizationManager.isActualTransactionActive());
        Assert.assertTrue(TestTransaction.isActive());
        Assert.assertEquals(
                Integer.valueOf(3),
                jdbcTemplate1.queryForObject("select count(1) from users", Integer.class));
    }


    @Test
    @Transactional("txManager2")
    @Sql(value = {"classpath:schema.sql", "classpath:init-data.sql"},
            config =
            @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",
                    dataSource = "dataSource2", transactionManager = "txManager2"))
    public void test02_simple() {
        Assert.assertEquals(
                Integer.valueOf(2),
                jdbcTemplate2.queryForObject("select count(1) from users", Integer.class));
    }


    @Test
    @Transactional("txManager2")
    @Sql(value = {"classpath:schema.sql", "classpath:init-data.sql"},
            config =
            @SqlConfig(encoding = "utf-8", separator = ";", commentPrefix = "--",
                    dataSource = "dataSource2", transactionManager = "txManager2"))
    public void test03_simple() {
        Assert.assertEquals(
                Integer.valueOf(2),
                jdbcTemplate2.queryForObject("select count(1) from users", Integer.class));
        TestTransaction.flagForRollback();
    }

    @Rule
    public TestName testName = new TestName();
    @AfterTransaction
    public void afterTransaction() {
        System.out.println(testName.getMethodName());
        if("test03_simple".equals(testName.getMethodName())) {
            Assert.assertEquals(
                    Integer.valueOf(0),
                    jdbcTemplate2.queryForObject("select count(1) from users", Integer.class));
        }
    }
}

可以使用//判断是在事务中执行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

5
0
分享到:
评论
5 楼 forcer521 2014-09-10  
牛啊
4 楼 jinnianshilongnian 2014-08-20  
lizhengd1 写道
博主什么时候弄个 springmvc+spring+mybatis的教程吧,谢啦

有spring+mybatis集成  没有springmvc+spring+mybatis集成,不过他们差不多的啊,只要学会了单个 只是组合起来再用的问题了。
3 楼 jinnianshilongnian 2014-08-20  
yangmuguang 写道
大侠,,你这个是通过spring官网出的资料翻译的吗?

自己搜索spring源代码 查找since 4.1 然后挨着看和测试的
2 楼 lizhengd1 2014-08-20  
博主什么时候弄个 springmvc+spring+mybatis的教程吧,谢啦
1 楼 yangmuguang 2014-08-20  
大侠,,你这个是通过spring官网出的资料翻译的吗?

相关推荐

    Spring4.X最新帮助文档带视图结构树的

    Spring 4.1的新特性和增强功能** - **介绍:** 本章节介绍了Spring 4.1版本中新增或改进的功能。 - **知识点:** - **JMS改进(JMS Improvements):** 增强了JMS支持,例如更灵活的消息发送机制。 - **缓存改进...

    spring-roo-docs

    替代教程通过一个具体的例子——婚礼RSVP应用——来展示如何使用SpringRoo。这个例子包括: - 应用概述:描述应用的功能需求。 - 步骤详解:逐步指导如何使用SpringRoo完成应用开发的各个阶段。 - 最终成果:展示...

    spring in action 英文原版

    - **测试**:提供了对JUnit和TestNG的支持,方便开发者编写单元测试和集成测试。 #### 2.2 理解控制反转 - **控制反转(Inversion of Control, IoC)**:IoC是一种设计模式,其中对象的创建、组装和管理被委托给一...

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

     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 拦截器...

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

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

    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 拦截器...

    Struts2.5+Hibernate3.3+Spring应用开发实例

    学员将深入学习Spring的核心概念,如Bean的生命周期、依赖注入、AOP的使用等,同时,通过一个具体的Spring应用案例,掌握如何利用Spring进行模块化、组件化开发,提升代码的可维护性和可测试性。 #### 三、...

    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 拦截器...

    SSM框架开发所需jar包

    1. **Spring 4.1**: Spring 是一个开源的应用框架,它提供了全面的企业级应用开发解决方案,包括依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问/集成、MVC框架等。Spring 4.1版本引入了对Java 8的支持,...

    《Spring 3.x企业应用开发实战》:实战案例开发

    ### Spring 3.x企业应用开发实战之实战案例开发——论坛应用 #### 1. 案例概述 在本章中,《Spring 3.x企业应用开发实战》一书通过一个具体的论坛案例,深入介绍了如何使用Spring+Hibernate集成框架进行开发的过程...

    基于jsp+ssh易商B2C网上交易系统源码数据库论文.doc

    4.2 集成测试:检查系统各模块间的协同工作情况,确保整体流程的顺畅。 4.3 压力测试:模拟大量用户并发访问,评估系统的负载能力和稳定性。 第五章 系统上线与维护 5.1 系统部署:将开发完成的系统部署到服务器...

    Spring+SpringMVC+MyBatis整合教程

    ### SSM框架——详细整合教程(Spring+SpringMVC+MyBatis) #### 1、基本概念 **1.1、Spring** Spring 是一个开源框架,最初由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的...

    基于springboot的明星周边产品销售网站源码数据库.doc

    - **集成测试**:验证各模块间的协同工作情况。 - **性能测试**:评估系统的响应速度、负载能力等性能指标。 - **安全测试**:确保系统的安全性,防止恶意攻击。 #### 六、总结与展望 通过《星之语》明星周边产品...

    ssm考研互学互助专区网站论文 .doc

    SSM是Java Web开发中常用的三大框架——Spring、Spring MVC和MyBatis的简称。Spring作为核心框架,负责依赖注入和事务管理,提高了代码的可测试性和解耦性;Spring MVC则用于处理HTTP请求和响应,实现业务逻辑与视图...

    springboot485基于springboot的宠物健康顾问系统pf.zip

    6.2 测试框架:JUnit和Mockito用于单元测试,Spring Boot Test支持集成测试。 总结,基于SpringBoot的宠物健康顾问系统"pf"充分利用了Spring生态的优势,构建了一个高效、易维护的系统。通过理解其架构、技术选型及...

    基于springboot+vue的B2C模式的电子商务平台源码数据库.docx

    测试主要包括单元测试、集成测试和性能测试等阶段。最后,将系统部署到服务器上,使其能够在真实的环境中运行。 综上所述,基于SpringBoot+Vue的B2C模式的电子商务平台是一个综合性的项目,涉及到前端、后端以及...

    毕业论文springboot181基于springboot的乐享田园系统论文.doc

    进行单元测试、集成测试和系统测试,确保功能的正确性和性能的稳定性。 第 7 章 结论 乐享田园系统的成功开发,不仅解决了传统土地租赁管理的痛点,还提升了用户体验,为农业领域的信息化管理提供了有效解决方案。...

    毕业论文ssm265基于vue的搬家预约系统+vuessm265基于vue的搬家预约系统+论文.doc

    通过单元测试、集成测试和系统测试,确保系统功能的正确性和性能的稳定性。 第 7 章 结果与总结 7.1 系统成果展示 通过系统截图展示实际运行效果,证明系统设计目标的达成。 7.2 项目总结 回顾开发过程,总结经验...

    微信小程序大学校园二手教材与书籍拍卖系统源码数据库.docx

    ### 微信小程序大学校园二手教材与书籍拍卖系统源码数据库 #### 一、项目背景与意义 在当今数字化时代,随着应用技术和电子商务平台的快速发展,线上二手交易平台为传统二手交易市场带来了全新的生命力。特别是在...

Global site tag (gtag.js) - Google Analytics