项目概况

数据隔离

2026-01-291 min read未分类
场景分析

!!!info 数据隔离

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

解决方案

!!!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}