0%

spring-dbunit使用指南

目标:

​ 帮助你些一个可以多次重复运行且不依赖数据库现在数据的单元测试。
​ 官方文档:传送门

QuickStart

1、引入依赖

​ 具体版本视自己项目情况定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
<dependency>
<groupId>com.github.springtestdbunit</groupId>
<artifactId>spring-test-dbunit</artifactId>
<version>1.3.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
<version>2.5.0</version>
<type>jar</type>
<scope>test</scope>
</dependency>

2、配置

代码配置:基于现有可运行的单元测试的基础上,增加@TestExecutionListeners配置,如代码所示:
1
2
3
4
5
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
@DbUnitConfiguration(databaseConnection={"customDataSource")
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
DbUnitTestExecutionListener.class})
  • DependencyInjectionTestExecutionListener:负责注入单元测试中使用到的依赖。
  • DbUnitTestExecutionListener:负责处理dbunit相关注解(见3、主要功能说明)。
  • DbUnitConfiguration: 检查自己的dataSource的beanName,如果属于{“dbUnitDatabaseConnection”, “dataSource”}其中之一,可省略这个配置,否则需要加上,配置自己的beanName。

注:{“dbUnitDatabaseConnection”, “dataSource”}为dbunit默认去springContext中加载dataSource时使用的beanName。

3、主要功能说明

  • @DatabaseSetup - 在testMethod执行之前会执行@DatabaseSetup,用于初始化测试数据
    • connection - 连接的数据源,单数据源可不配置
    • type - 操作类型,参考DatabaseOperation枚举
    • value - 数据xml
1
2
3
// DatabaseSetup的DatabaseOperation默认值是CLEAN_INSERT,即清空表再插入数据,
// 明显与我们需求不符,配置成DatabaseOperation.INSERT即可。
@DatabaseSetup(value = "classpath:biz_info.xml",type = DatabaseOperation.INSERT)
  • @DatabaseTearDown - 在testMethod执行之后会执行@DatabaseTearDown,用于回滚删除测试数据
    配置项与@DatabaseSetup一致
1
2
// DatabaseTearDown的DatabaseOperation默认值为CLEAN_INSERT,即删除插入的数据。
@DatabaseTearDown("classpath:biz_info.xml")
  • @ExpectedDatabase - 在testMethod执行之后会执行@ExpectedDatabase,早于@DatabaseTearDown用于测试结果校验(比较的是数据库中当前的记录和xml中配置的数据值是否完全一致,有点鸡肋
    • connection - 连接的数据源,单数据源可不配置
    • value - 数据xml
1
2
// 比较的是数据库的值和xml中配置的数据值,有点鸡肋
@ExpectedDatabase("classpath:result.xml")

4、其他

  • 如何配置回滚

    1. 修改DbUnitTestExecutionListenerTransactionDbUnitTestExecutionListener。
    2. 加上@Transactional注解。
    3. 在method上配置@DatabaseTearDown,标明要回滚删除哪些数据。
  • 多数据源如何配置

    1. 测试类上配置@DbUnitConfiguration(databaseConnection={“customDataSource”,”dataSource”})
    2. 在method上使用@DatabaseTearDown|@DatabaseSetUp|@ExpectedDatabase时加上connection配置,指定dataSource

例:@DatabaseTearDown(connection = “dataSource”,value=”classpath:biz_info.xml”)**


Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:daoApplicationContext.xml")
@DbUnitConfiguration(databaseConnection = {"dateSource"})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
TransactionDbUnitTestExecutionListener.class})
@Transactional
public class DistributeConfigTest {

@Autowired
BizInfoDAO bizInfoDAO;

@Test
@DatabaseSetup(value = "classpath:biz_info.xml",type = DatabaseOperation.INSERT)
@DatabaseTearDown(connection = "dateSource",value = "classpath:biz_info.xml")
@ExpectedDatabase(connection = "dateSource",value = "classpath:result.xml")
public void test_findAllBizInfo(){
List<BizInfoPO> bizInfoList = bizInfoDAO.findAll();

assertNotNull(bizInfoList);
assertEquals(2,bizInfoList.size());
}
}

biz_info.xml

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<!-- biz_info为表名,后面是字段 -->
<dataset>
<biz_info delete_mark="0" biz_code="a" biz_name="a"/>
<biz_info delete_mark="0" biz_code="b" biz_name="b"/>
</dataset>

result.xml

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<biz_info delete_mark="0" biz_code="a" biz_name="a"/>
<biz_info delete_mark="0" biz_code="b" biz_name="b"/>
</dataset>