Spring+DbUnit测试

更新时间:2023-06-15 18:18:04 阅读: 评论:0

Spring+DbUnit测试
Spring dbunit
spring-test-dbunit 提供了 Spring 与 DbUnit 的集成,在 Spring 中我们可以使⽤注解来进⾏数据的准备和清理。
配置
为了使⽤ DbUnit 的注解,我们需要使⽤ DbUnitTestExecutionListener 类,下⾯是典型的使⽤ JUnit 4 的注解
@RunWith(SpringJUnit4ClassRunner.class)mns
@ContextConfiguration
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
DbUnitTestExecutionListener.class })
does什么意思
准备与清理
完成配置后,我们需要使⽤的注解是 @DatabaSetup 和 @DatabaTearDown 来进⾏数据库的数据初始化和重置。
初始化
下⾯是典型的注解使⽤,这⾥我们使⽤ l 作为数据⽂件,这个⽂件通常在测试类的同⼀个包下。
@DatabaSetup("l")
北京it培训你也可以使⽤其它路径,如
@DatabaSetup("/META-INF/l")
默认情况下,初始化的时候会进⾏ CLEAN_INSERT 操作,这意味着所有在数据⽂件,即这⾥的 l 中的表的数据,在插⼊数据时会被删除。这个是 DBUnit 的其中⼀个⾏为,详细的参考 DBUnit 的⽂档。
重置
@DatabaTearDown 注解⽤来在测试完成之后重置数据,与 @DatabaSetup 类似,可以使⽤在类上或⽅法上,它们有⼀样的属性可以设置。
注意:如果你将此注解与 @Transactional ⼀起使⽤,你可能需要更改配置。下⾯会有相应解释。
验证
@ExpectedDataba ⽤来验证数据库的数据是否和期待的⼀样。⽐如当我们插⼊或删除数据的时候,就很有⽤。这个注解可以使⽤在类或⽅法上,当在类上使⽤时,每⼀个测试⽅法都会进⾏数据⽐较。
⽤法:
antiy@ExpectedDataba("l")
@ExpectedDataba ⽀持两种不同的模式,DatabaAsrtionMode.DEFAULT 是默认的模式,它⽐较整个数据
库。DatabaAsrtionMode.NON_STRICT 会忽略没有在期待的数据集⽂件中出现的表或列。通常后⼀种模式是常⽤的,因为我们的⽅法通常情况下只会影响⼏个表或⼏个列。
事务
如果你⼀同使⽤了 DbUnitTestExecutionListener 和 TransactionalTestExecutionListener 你可能会遇到与事务相关的问题。⽐如事务没有开始或在数据验证之前进⾏了回滚等。为了在 DBUnit 中使⽤事务,我们应该使⽤ TransactionDbUnitTestExecutionListener 。
修改后的配置如下:
@ContextConfiguration
@Transactional
cnn
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
新东方雅思班
TransactionDbUnitTestExecutionListener.class })
沈阳培训
事务会在 @DatabaSetup 之前启动,在 @DatabaTearDown 和 @ExpectedDataba 之后结束。
⽰例
我们有两个服务类:
StudentService 学⽣服务类
ClazzService 班级服务类
ClazzService 有⼀个删除⽅法,删除班级时,先删除该班级下的所有学⽣
学习日语网@Transactional
public void delete(Long id) {
studentService.deleteByClazzId(id);
clazzDao.delete(id);
}
下⾯的例⼦针对这个⽅法进⾏测试。
数据准备
初始数据 l ,这⾥是 dbunit 的 FlatXmlDataSet 格式,元素名代表表名,属性对应字段名。
<?xml version="1.0" encoding="utf-8" ?>
<datat>
<student id="1"name="student1"clazz_id="1"/>
<student id="2"name="student2"clazz_id="2"/>
<clazz id="1"name="clazz1"/>
<clazz id="2"name="clazz2"/>
</datat>
假设我们删除了班级 id 为 1 的班级,则我们期待的数据库数据为 l
<?xml version="1.0" encoding="utf-8" ?>
healer是什么意思<datat>
<student id="2"name="student2"clazz_id="2"/>
<clazz id="2"name="clazz2"/>
</datat>
编写测试
ClazzServiceTest
@ContextConfiguration("l")
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
benifitTransactionDbUnitTestExecutionListener.class})
public class ClazzServiceTest {
@Autowired ClazzService clazzService;
@Test
@Transactional
@DatabaSetup("l")
@ExpectedDataba("l")
public void testDelete() {
clazzService.delete(1L);
}
}
有时候我们对多个⽅法进⾏测试的时候,对数据库进⾏了多次删除、插⼊操作的时候,@Transaction
al 能使数据库数据回滚,但是⾃增字段不会重设,这时候对我们的测试就会造成⼲扰,因为我们⽆法确定下⼀次插⼊数据时⾃增字段的值。关于这个问题参考

本文发布于:2023-06-15 18:18:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/146148.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   删除   事务   测试   数据库   可能   配置   培训
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图