数据隔离
场景分析
!!!info 数据隔离
数据隔离一直是一个测试的痛点,测试数据可能是 mock 的数据,所以单测过程中,难免会造成脏数据
这种场景,有通用的解决方案。JUnit 已经帮我们做好了。这里我们只讲实操和用法。
如果有兴趣的话可以研究下
解决方案
!!!note 单测引导类配置说明
- @Transactional 如果加上这个注解,就代表全局的单测,事务执行完都会自动回滚
- @Rollback(false) 如果想某个方法事务不回滚,可以单独在方法上设置。
【方法级别>全局】 !!!
下面这两个方法
- 第一个方法因为是使用测试全局事务配置,所以默认是回滚。
- 第二个方法因为使用了方法事务配置,所以会忽略全局配置,然后提交事务。
单测引导类配置
java
1@Slf4j
2@ActiveProfiles({"local"})
3// 使用Spring容器引导
4@RunWith(SpringRunner.class)
5// 默认就是回滚,不用加@Rollback,如果全局不想回滚就在这个吧@Rollback(false),如果某个单测不想回滚,就放到单侧类上
6@Transactional
7@SpringBootTest(classes = {CenterProviderApplication.class}) // 指定启动类
8public class BaseApplicationTest {
9
10 // 全局事务,默认自动回滚
11 @Test
12 public void testInsert() {
13 String json = "{
14" +
15 " "id": 1344215264312557570,
16" +
17 " "arrivalOrderId": 1344215264287391745,
18" +
19 " "goodsDeployId": 1344170561282879489,
20" +
21 " "expectedReceiveNum": 150,
22" +
23 "}";
24 OrderDetailDO orderDetail = TestConsole.toObject(json, ArrivalNoticeOrderDetailDO.class);
25 orderDetail.setId(null);
26 orderDetail.setCreaterId(888888L);
27 // true
28 Assert.assertTrue(DB.insert(orderDetail) > 0);
29 // notNull
30 Assert.assertNotNull(DB.selectById(orderDetail.getId()));
31 }
32
33 // 方法事务>全局事务, 这里声明了不自动回滚
34 @Test
35 @Rollback(value = false)
36 public void testInsert() {
37 String json = "{
38" +
39 " "id": 1344215264312557570,
40" +
41 " "arrivalOrderId": 1344215264287391745,
42" +
43 " "goodsDeployId": 1344170561282879489,
44" +
45 " "expectedReceiveNum": 150,
46" +
47 "}";
48 OrderDetailDO orderDetail = TestConsole.toObject(json, ArrivalNoticeOrderDetailDO.class);
49 orderDetail.setId(null);
50 orderDetail.setCreaterId(888888L);
51 // true
52 Assert.assertTrue(DB.insert(orderDetail) > 0);
53 // notNull
54 Assert.assertNotNull(DB.selectById(orderDetail.getId()));
55 }
56}