前言

单元测试中我们常常需要预置一些测试数据,UT 提供了多种方式 ,包括 SQL 文件、yml、注解等。

Mock 数据

SQL 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_goods
-- ----------------------------
DROP TABLE IF EXISTS `t_goods`;
-- 新建表
DROP TABLE IF EXISTS `t_goods`;
CREATE TABLE `t_goods` (
`id` varchar(128) NOT NULL COMMENT 'id',
`name` varchar(128) NOT NULL COMMENT '商品名称',
`sku` varchar(128) NOT NULL COMMENT '商品规格',
`inventory` int(11) NOT NULL COMMENT '库存数量',
PRIMARY KEY (`id`)
) COMMENT = '商品';

-- ----------------------------
-- Records of t_goods
-- ----------------------------
INSERT INTO `t_goods` VALUES ('1', 'apple', 'apple-10001', 100);

SET FOREIGN_KEY_CHECKS = 1;

通过将 @SqlDateSet(value = “/data/t_goods.sql”) 注解放在测试类或测试方法上,即可在单元测试之前将 SQL 数据预置到 H2 数据库。

yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
testData:
- table:
name: t_goods
rows:
- row:
columns:
- col:
name: 'id'
value: "1"
isId: true
- col:
name: 'name'
value: 'apple'
- col:
name: 'sku'
value: 'apple-10001'
- col:
name: 'inventory'
value: "100"

通过将 @YmlDataSet({“/data/t_goods.yml”}) 注解放在测试类或测试方法上,即可在单元测试之前将 yml 数据预置到 H2 数据库。

这种方式,需要提前准备好数据库表结构,如果你的应用是 Spring 项目的话,可以使用 @Sql({“classpath:sql/goods.sql”}) 注解来完成这个任务。

注解

1
2
3
4
5
6
7
8
9
@DataSet(testData = {
@Table(name = "t_goods", rows = {
@Row(columns = {
@Col(name = "id", value = "1", isId = true),
@Col(name = "name", value = "apple"),
@Col(name = "sku", value = "apple-10001"),
@Col(name = "inventory", value = "100")
})})
})

通过将 @DataSet 注解放在测试类或测试方法上,即可在单元测试之前将数据预置到 H2 数据库。

这种方式,需要提前准备好数据库表结构,如果你的应用是 Spring 项目的话,可以使用 @Sql({“classpath:sql/goods.sql”}) 注解来完成这个任务。

持久层单元测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Component
@SqlDateSet(value = "/data/t_goods.sql")
public class GoodsMapperSqlDateSetTest extends BaseMockDatabase {

@Resource
GoodsMapper goodsMapper;

@Test
@DisplayName("数据库单测用例 - 查询")
public void select() {
GoodsPo result = goodsMapper.selectOne("1");
Assertions.assertThat(result)
.hasFieldOrPropertyWithValue("id", "1")
.hasFieldOrPropertyWithValue("name", "apple")
.hasFieldOrPropertyWithValue("sku", "apple-10001")
.hasFieldOrPropertyWithValue("inventory", 100);
}
}

@YmlDataSet、@DataSet 注解的用法与上例类似。

如果在类上和方法上同时存在 @SqlDateSet(、@YmlDataSet、@DataSet) 注解,则以方法上为准。