目录
Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介
在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来断言回滚后数据没 有插入。
相关文章
Spring4新特性
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——注解、脚本、任务、MVC等其他特性改进
源码下载
https://github.com/zhangkaitao/spring4-1-showcase/tree/master/spring4.1-dbtest
相关推荐
Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...
Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...
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 拦截器...
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 拦截器...
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 拦截器...
——数据库应用开发 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 到目前为止的领域模型 ...
第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测试用例 ...
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 ...
SQL Server 2000与以前版本相比较,又具有以下新特性 : 1.支持XML(Extensive Markup Language,扩展标记语言) 2.强大的基于Web的分析 3.支持OLE DB和多种查询 4.支持分布式的分区视图 安装、...
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 流程定义打包部署 ...
SSH 为 Struts+Spring+Hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久...