package cn.iocoder.yudao.module.mes.service.wm.arrivalnotice; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; import org.springframework.test.context.bean.override.mockito.MockitoBean; import jakarta.annotation.Resource; import java.math.BigDecimal; import java.util.Arrays; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; /** * {@link MesWmArrivalNoticeServiceImpl} 的单元测试 * * @author 芋道源码 */ @Import(MesWmArrivalNoticeServiceImpl.class) public class MesWmArrivalNoticeServiceImplTest extends BaseDbUnitTest { @Resource private MesWmArrivalNoticeServiceImpl arrivalNoticeService; @Resource private MesWmArrivalNoticeMapper arrivalNoticeMapper; @MockitoBean private MesWmArrivalNoticeLineService arrivalNoticeLineService; @Test public void testUpdateArrivalNoticeWhenIqcFinish_success_allLinesChecked() { // mock 数据:插入一条待质检的到货通知单 MesWmArrivalNoticeDO notice = randomPojo(MesWmArrivalNoticeDO.class, o -> { o.setStatus(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus()); }); arrivalNoticeMapper.insert(notice); // 准备参数 Long noticeId = notice.getId(); Long lineId = randomLongId(); Long iqcId = randomLongId(); BigDecimal qualifiedQuantity = BigDecimal.valueOf(100); // mock 行服务方法:所有需检行都已完成(iqcId 不为空) MesWmArrivalNoticeLineDO line1 = randomPojo(MesWmArrivalNoticeLineDO.class, o -> { o.setNoticeId(noticeId); o.setIqcCheckFlag(true); o.setIqcId(iqcId); // 已检完 }); MesWmArrivalNoticeLineDO line2 = randomPojo(MesWmArrivalNoticeLineDO.class, o -> { o.setNoticeId(noticeId); o.setIqcCheckFlag(false); // 不需要检验 o.setIqcId(null); }); when(arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(eq(noticeId))) .thenReturn(Arrays.asList(line1, line2)); // 调用 // arrivalNoticeService.updateArrivalNoticeWhenIqcFinish(noticeId, lineId, iqcId, qualifiedQuantity); // 断言:行回写被调用 // verify(arrivalNoticeLineService).updateArrivalNoticeLineWhenIqcFinish(eq(lineId), eq(iqcId), eq(qualifiedQuantity)); // 断言:主表状态更新为待入库 MesWmArrivalNoticeDO updatedNotice = arrivalNoticeMapper.selectById(noticeId); assertEquals(MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus(), updatedNotice.getStatus()); } @Test public void testUpdateArrivalNoticeWhenIqcFinish_success_hasUncheckedLines() { // mock 数据:插入一条待质检的到货通知单 MesWmArrivalNoticeDO notice = randomPojo(MesWmArrivalNoticeDO.class, o -> { o.setStatus(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus()); }); arrivalNoticeMapper.insert(notice); // 准备参数 Long noticeId = notice.getId(); Long lineId = randomLongId(); Long iqcId = randomLongId(); BigDecimal qualifiedQuantity = BigDecimal.valueOf(50); // mock 行服务方法:还有未完成的需检行 MesWmArrivalNoticeLineDO line1 = randomPojo(MesWmArrivalNoticeLineDO.class, o -> { o.setNoticeId(noticeId); o.setIqcCheckFlag(true); o.setIqcId(iqcId); // 已检完 }); MesWmArrivalNoticeLineDO line2 = randomPojo(MesWmArrivalNoticeLineDO.class, o -> { o.setNoticeId(noticeId); o.setIqcCheckFlag(true); o.setIqcId(null); // 还未检验 }); when(arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(eq(noticeId))) .thenReturn(Arrays.asList(line1, line2)); // 调用 // arrivalNoticeService.updateArrivalNoticeWhenIqcFinish(noticeId, lineId, iqcId, qualifiedQuantity); // 断言:行回写被调用 // verify(arrivalNoticeLineService).updateArrivalNoticeLineWhenIqcFinish(eq(lineId), eq(iqcId), eq(qualifiedQuantity)); // 断言:主表状态不变,仍然是待质检 MesWmArrivalNoticeDO updatedNotice = arrivalNoticeMapper.selectById(noticeId); assertEquals(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus(), updatedNotice.getStatus()); } @Test public void testUpdateArrivalNoticeWhenIqcFinish_noticeNotExists() { // 准备参数 Long noticeId = randomLongId(); Long lineId = randomLongId(); Long iqcId = randomLongId(); BigDecimal qualifiedQuantity = BigDecimal.valueOf(100); // 调用,并断言异常 // assertServiceException( // () -> arrivalNoticeService.updateArrivalNoticeWhenIqcFinish(noticeId, lineId, iqcId, qualifiedQuantity), // WM_ARRIVAL_NOTICE_NOT_EXISTS); } @Test public void testUpdateArrivalNoticeWhenIqcFinish_statusNotPendingQc() { // mock 数据:插入一条草稿状态的到货通知单(非待质检) MesWmArrivalNoticeDO notice = randomPojo(MesWmArrivalNoticeDO.class, o -> { o.setStatus(MesWmArrivalNoticeStatusEnum.PREPARE.getStatus()); }); arrivalNoticeMapper.insert(notice); // 准备参数 Long noticeId = notice.getId(); Long lineId = randomLongId(); Long iqcId = randomLongId(); BigDecimal qualifiedQuantity = BigDecimal.valueOf(100); // 调用,并断言异常 // assertServiceException( // () -> arrivalNoticeService.updateArrivalNoticeWhenIqcFinish(noticeId, lineId, iqcId, qualifiedQuantity), // WM_ARRIVAL_NOTICE_STATUS_NOT_PENDING_QC); } }