Commit b7fab2643511a259b819beddcd87f4927abd972e

Authored by YunaiV
1 parent 75033900

test(promotion): 补充秒杀库存回补回归测试

- 覆盖秒杀商品配置不存在时跳过库存恢复、正常配置同时恢复商品与活动库存
- 精简判空分支注释和日志,对齐项目代码风格

关联 PR: #1266
关联 issue: #1265
yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillActivityServiceImpl.java
... ... @@ -188,9 +188,8 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
188 188 @Transactional(rollbackFor = Exception.class)
189 189 public void updateSeckillStockIncr(Long id, Long skuId, Integer count) {
190 190 SeckillProductDO product = seckillProductMapper.selectByActivityIdAndSkuId(id, skuId);
191   - if (product == null) {
192   - // 秒杀活动已删除时,库存已无回写对象;记日志并跳过,不阻断订单取消主流程
193   - log.warn("[updateSeckillStockIncr][秒杀活动({}) sku({}) 的商品配置不存在(活动可能已删除),跳过库存回写]", id, skuId);
  191 + if (product == null) { // 活动已删除,或 SKU 已从活动移除,跳过秒杀库存恢复,避免阻断订单取消
  192 + log.warn("[updateSeckillStockIncr][活动({}) skuId({}) 对应的秒杀商品不存在,跳过库存恢复]", id, skuId);
194 193 return;
195 194 }
196 195 // 更新活动商品库存
... ...
yudao-module-mall/yudao-module-promotion/src/test/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillActivityServiceImplStockTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.service.seckill;
  2 +
  3 +import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
  4 +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillProductDO;
  5 +import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper;
  6 +import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillProductMapper;
  7 +import org.junit.jupiter.api.Test;
  8 +import org.mockito.InjectMocks;
  9 +import org.mockito.Mock;
  10 +
  11 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
  12 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  13 +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
  14 +import static org.mockito.ArgumentMatchers.anyInt;
  15 +import static org.mockito.ArgumentMatchers.anyLong;
  16 +import static org.mockito.ArgumentMatchers.eq;
  17 +import static org.mockito.Mockito.never;
  18 +import static org.mockito.Mockito.verify;
  19 +import static org.mockito.Mockito.when;
  20 +
  21 +/**
  22 + * {@link SeckillActivityServiceImpl} 的库存单元测试类
  23 + *
  24 + * @author 芋道源码
  25 + */
  26 +public class SeckillActivityServiceImplStockTest extends BaseMockitoUnitTest {
  27 +
  28 + @InjectMocks
  29 + private SeckillActivityServiceImpl seckillActivityService;
  30 +
  31 + @Mock
  32 + private SeckillActivityMapper seckillActivityMapper;
  33 + @Mock
  34 + private SeckillProductMapper seckillProductMapper;
  35 +
  36 + @Test
  37 + public void testUpdateSeckillStockIncr_success() {
  38 + // 准备参数
  39 + Long id = randomLongId();
  40 + Long skuId = randomLongId();
  41 + Integer count = 2;
  42 + // mock 方法
  43 + SeckillProductDO product = randomPojo(SeckillProductDO.class, o -> {
  44 + o.setActivityId(id);
  45 + o.setSkuId(skuId);
  46 + });
  47 + when(seckillProductMapper.selectByActivityIdAndSkuId(eq(id), eq(skuId))).thenReturn(product);
  48 +
  49 + // 调用
  50 + seckillActivityService.updateSeckillStockIncr(id, skuId, count);
  51 + // 断言
  52 + verify(seckillProductMapper).updateStockIncr(eq(product.getId()), eq(count));
  53 + verify(seckillActivityMapper).updateStockIncr(eq(id), eq(count));
  54 + }
  55 +
  56 + @Test
  57 + public void testUpdateSeckillStockIncr_notExists() {
  58 + // 准备参数
  59 + Long id = randomLongId();
  60 + Long skuId = randomLongId();
  61 + Integer count = 2;
  62 + // mock 方法(活动已删除,或 SKU 已从活动移除)
  63 + when(seckillProductMapper.selectByActivityIdAndSkuId(eq(id), eq(skuId))).thenReturn(null);
  64 +
  65 + // 调用
  66 + assertDoesNotThrow(() -> seckillActivityService.updateSeckillStockIncr(id, skuId, count));
  67 + // 断言
  68 + verify(seckillProductMapper, never()).updateStockIncr(anyLong(), anyInt());
  69 + verify(seckillActivityMapper, never()).updateStockIncr(anyLong(), anyInt());
  70 + }
  71 +
  72 +}
... ...