package com.ruoyi.quality.service; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.quality.dto.QualityInspectDto; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.mapper.QualityTestStandardMapper; import com.ruoyi.quality.mapper.QualityUnqualifiedMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectParam; import com.ruoyi.quality.service.impl.QualityInspectServiceImpl; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class QualityInspectServiceImplTest { @Mock private QualityInspectMapper inspectMapper; @Mock private IQualityInspectParamService paramService; @Mock private QualityTestStandardMapper standardMapper; @Mock private QualityUnqualifiedMapper unqualifiedMapper; @Mock private SalesLedgerProductMapper productMapper; @Mock private ProcurementRecordService procurementRecordService; @InjectMocks private QualityInspectServiceImpl service; @Test void addPersistsInspectionAndMetrics() { QualityInspectDto dto = new QualityInspectDto(); QualityInspectParam parameter = new QualityInspectParam(); dto.setQualityInspectParams(Collections.singletonList(parameter)); when(inspectMapper.insert(any(QualityInspect.class))).thenAnswer(invocation -> { QualityInspect inspect = invocation.getArgument(0); inspect.setId(12L); return 1; }); when(paramService.saveBatch(dto.getQualityInspectParams())).thenReturn(true); int result = service.add(dto); assertEquals(1, result); ArgumentCaptor inspectCaptor = ArgumentCaptor.forClass(QualityInspect.class); verify(inspectMapper).insert(inspectCaptor.capture()); assertEquals(0, inspectCaptor.getValue().getInspectState()); assertEquals(12L, parameter.getInspectId()); } @Test void submitRejectsRepeatedSubmissionBeforeCreatingSideEffects() { QualityInspect submitted = new QualityInspect(); submitted.setId(5L); submitted.setInspectState(1); when(inspectMapper.selectById(5L)).thenReturn(submitted); QualityInspect request = new QualityInspect(); request.setId(5L); ServiceException error = assertThrows(ServiceException.class, () -> service.submit(request)); assertEquals("检验记录已提交,请勿重复操作", error.getMessage()); verify(unqualifiedMapper, never()).insert(any()); verify(procurementRecordService, never()).add(any()); } @Test void submitRejectsInspectionWithoutMetrics() { QualityInspect stored = pendingInspection(); when(inspectMapper.selectById(5L)).thenReturn(stored); when(paramService.list(any())).thenReturn(Collections.emptyList()); QualityInspect request = new QualityInspect(); request.setId(5L); ServiceException error = assertThrows(ServiceException.class, () -> service.submit(request)); assertEquals("检验项目为空,不能提交", error.getMessage()); } @Test void submitRejectsMetricWithoutTestValue() { QualityInspect stored = pendingInspection(); QualityInspectParam parameter = new QualityInspectParam(); parameter.setParameterItem("硬度"); when(inspectMapper.selectById(5L)).thenReturn(stored); when(paramService.list(any())).thenReturn(Collections.singletonList(parameter)); QualityInspect request = new QualityInspect(); request.setId(5L); ServiceException error = assertThrows(ServiceException.class, () -> service.submit(request)); assertEquals("检验项目“硬度”尚未填写检验值", error.getMessage()); } private QualityInspect pendingInspection() { QualityInspect stored = new QualityInspect(); stored.setId(5L); stored.setInspectState(0); stored.setCheckResult("合格"); return stored; } }