数据隔离

西魏陶渊明 ... 2022-3-24 大约 1 分钟

数据隔离

数据隔离一直是一个测试的痛点,测试数据可能是 mock 的数据,所以单测过程中,难免会造成脏数据 这种场景,有通用的解决方案。JUnit 已经帮我们做好了。这里我们只讲实操和用法。 如果有兴趣的话可以研究下 TransactionalTestExecutionListener

# 解决方案

单测引导类配置说明

  • @Transactional 如果加上这个注解,就代表全局的单测,事务执行完都会自动回滚
  • @Rollback(false) 如果想某个方法事务不回滚,可以单独在方法上设置。【方法级别>全局】

下面这两个方法

  • 第一个方法因为是使用测试全局事务配置,所以默认是回滚。
  • 第二个方法因为使用了方法事务配置,所以会忽略全局配置,然后提交事务。

单测引导类配置

@Slf4j
@ActiveProfiles({"local"})
// 使用Spring容器引导
@RunWith(SpringRunner.class)
// 默认就是回滚,不用加@Rollback,如果全局不想回滚就在这个吧@Rollback(false),如果某个单测不想回滚,就放到单侧类上
@Transactional
@SpringBootTest(classes = {CenterProviderApplication.class}) // 指定启动类
public class BaseApplicationTest {

    // 全局事务,默认自动回滚
    @Test
    public void testInsert() {
        String json = "{\n" +
                "  \"id\": 1344215264312557570,\n" +
                "  \"arrivalOrderId\": 1344215264287391745,\n" +
                "  \"goodsDeployId\": 1344170561282879489,\n" +
                "  \"expectedReceiveNum\": 150,\n" +
                "}";
        OrderDetailDO orderDetail = TestConsole.toObject(json, ArrivalNoticeOrderDetailDO.class);
        orderDetail.setId(null);
        orderDetail.setCreaterId(888888L);
        // true
        Assert.assertTrue(DB.insert(orderDetail) > 0);
        // notNull
        Assert.assertNotNull(DB.selectById(orderDetail.getId()));
    }
    
    // 方法事务>全局事务, 这里声明了不自动回滚
    @Test
    @Rollback(value = false)
    public void testInsert() {
        String json = "{\n" +
                "  \"id\": 1344215264312557570,\n" +
                "  \"arrivalOrderId\": 1344215264287391745,\n" +
                "  \"goodsDeployId\": 1344170561282879489,\n" +
                "  \"expectedReceiveNum\": 150,\n" +
                "}";
        OrderDetailDO orderDetail = TestConsole.toObject(json, ArrivalNoticeOrderDetailDO.class);
        orderDetail.setId(null);
        orderDetail.setCreaterId(888888L);
        // true
        Assert.assertTrue(DB.insert(orderDetail) > 0);
        // notNull
        Assert.assertNotNull(DB.selectById(orderDetail.getId()));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

本文由西魏陶渊明版权所有。如若转载,请注明出处:西魏陶渊明
上次编辑于: 2022年6月16日 21:10
贡献者: lxchinesszz