package cn.iocoder.yudao.module.mes.service.wm.transaction; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.math.BigDecimal; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_MATERIAL_STOCK_SELECTION_MISMATCH; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class MesWmTransactionReelSafetyTest { @InjectMocks private MesWmTransactionServiceImpl service; @Mock private MesWmMaterialStockService stockService; @Test void rejectsSelectedStockWithDifferentBatch() { when(stockService.getMaterialStock(1L)).thenReturn(new MesWmMaterialStockDO().setId(1L) .setItemId(2L).setWarehouseId(3L).setLocationId(4L).setAreaId(5L).setBatchId(6L)); MesWmTransactionSaveReqDTO req = new MesWmTransactionSaveReqDTO() .setType(MesWmTransactionTypeEnum.OUT.getType()).setQuantity(BigDecimal.ONE.negate()) .setItemId(2L).setWarehouseId(3L).setLocationId(4L).setAreaId(5L) .setBatchId(7L).setBatchCode("other-batch").setMaterialStockId(1L); ServiceException ex = assertThrows(ServiceException.class, () -> service.createTransaction(req)); assertEquals(WM_MATERIAL_STOCK_SELECTION_MISMATCH.getCode(), ex.getCode()); verify(stockService, never()).updateMaterialStockQuantity(anyLong(), any(), anyBoolean()); } }