前言
单元测试中我们常常需要预置一些测试数据,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;
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 = '商品';
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) 注解,则以方法上为准。