package com.battery.business.service.impl; 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.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import static org.mockito.Mockito.times; import java.math.BigDecimal; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.time.Instant; 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 com.ruoyi.common.exception.ServiceException; import com.battery.business.domain.TTest; import com.battery.business.domain.TTestBattery; import com.battery.business.domain.TTestChannelBinding; import com.battery.business.domain.TTestCollectorChannel; import com.battery.business.domain.TTestWarningThreshold; import com.battery.business.domain.TDetectionChannel; import com.battery.business.mapper.TTestMapper; /** 测试配置服务的业务契约测试。 */ @ExtendWith(MockitoExtension.class) class TTestServiceImplTest { @Mock private TTestMapper testMapper; @InjectMocks private TTestServiceImpl testService; @Test void createShouldReturnIdentifierAndInitializeIndependentStatuses() { TTest test = validTest(); mockEnabledOptions(); when(testMapper.insertTest(any(TTest.class))).thenAnswer(invocation -> { invocation.getArgument(0).setTestId(10L); return 1; }); doAnswer(invocation -> { invocation.getArgument(0).setRelationId(20L); return 1; }).when(testMapper).insertTestBattery(any(TTestBattery.class)); assertEquals(10L, testService.createTest(test)); assertEquals("WAITING", test.getTestStatus()); assertEquals("NOT_STARTED", test.getReceptionStatus()); assertEquals(7L, test.getCreatorId()); verify(testMapper).insertTestChannelBinding(any(TTestChannelBinding.class)); verify(testMapper, times(3)).insertTestCollectorChannel(any(TTestCollectorChannel.class)); verify(testMapper).insertTestThreshold(any(TTestWarningThreshold.class)); } @Test void listShouldAggregateBatteryNumbersOutsideDatabaseQuery() { TTest first = new TTest(); first.setTestId(10L); TTest second = new TTest(); second.setTestId(11L); TTestBattery firstBattery = new TTestBattery(); firstBattery.setTestId(10L); firstBattery.setBatteryNo("BAT-001"); TTestBattery secondBattery = new TTestBattery(); secondBattery.setTestId(10L); secondBattery.setBatteryNo("BAT-002"); when(testMapper.selectTestList(any(TTest.class))).thenReturn(java.util.List.of(first, second)); when(testMapper.selectBatteryNosByTestIds(java.util.List.of(10L, 11L))) .thenReturn(java.util.List.of(firstBattery, secondBattery)); java.util.List result = testService.selectTestList(new TTest()); assertEquals("BAT-001、BAT-002", result.get(0).getBatteryNo()); assertEquals("", result.get(1).getBatteryNo()); } @Test void createShouldRejectMissingCollector() { TTest test = validTest(); test.getBatteries().get(0).setCollectorId(null); mockEnabledPeopleAndType(); when(testMapper.countBatteryInEnabledGroup(1L, "BAT-001")).thenReturn(1); when(testMapper.countRegisteredChannel(100L)).thenReturn(1); ServiceException exception = assertThrows(ServiceException.class, () -> testService.createTest(test)); assertEquals("采集器不能为空", exception.getMessage()); verify(testMapper, never()).insertTest(any(TTest.class)); } @Test void createShouldRejectMissingRequiredCollectorChannel() { TTest test = validTest(); test.getBatteries().get(0).getCollectorChannels().remove(0); mockEnabledOptions(); ServiceException exception = assertThrows(ServiceException.class, () -> testService.createTest(test)); assertEquals("每个电池号必须绑定主温度、正电位主通道和负电位主通道", exception.getMessage()); verify(testMapper, never()).insertTest(any(TTest.class)); } @Test void createShouldAllowPlanStepsToBeConfiguredLater() { TTest test = validTest(); mockEnabledOptions(); when(testMapper.insertTest(any(TTest.class))).thenAnswer(invocation -> { invocation.getArgument(0).setTestId(10L); return 1; }); doAnswer(invocation -> { invocation.getArgument(0).setRelationId(20L); return 1; }).when(testMapper).insertTestBattery(any(TTestBattery.class)); assertEquals(10L, testService.createTest(test)); } @Test void createShouldRejectBatteryOutsideSelectedGroup() { TTest test = validTest(); mockEnabledPeopleAndType(); when(testMapper.countBatteryInEnabledGroup(1L, "BAT-001")).thenReturn(0); ServiceException exception = assertThrows(ServiceException.class, () -> testService.createTest(test)); assertEquals("电池号不属于所选启用电池组", exception.getMessage()); verify(testMapper, never()).insertTest(any(TTest.class)); } @Test void createShouldRejectDisabledCreator() { TTest test = validTest(); when(testMapper.countUserEnabled(7L)).thenReturn(0); ServiceException exception = assertThrows(ServiceException.class, () -> testService.createTest(test)); assertEquals("创建人不存在或已停用", exception.getMessage()); verify(testMapper, never()).insertTest(any(TTest.class)); } @Test void createShouldRejectDisabledPrincipal() { TTest test = validTest(); when(testMapper.countUserEnabled(7L)).thenReturn(1); when(testMapper.countUserEnabled(9L)).thenReturn(0); ServiceException exception = assertThrows(ServiceException.class, () -> testService.createTest(test)); assertEquals("测试负责人不存在或已停用", exception.getMessage()); verify(testMapper, never()).insertTest(any(TTest.class)); } @Test void createShouldRejectDuplicatePrimaryChannelBinding() { TTest test = validTest(); TTestBattery duplicate = validBattery("BAT-002", 2L, 100L); test.setBatteries(java.util.List.of(test.getBatteries().get(0), duplicate)); mockEnabledPeopleAndType(); when(testMapper.countBatteryInEnabledGroup(1L, "BAT-001")).thenReturn(1); when(testMapper.countBatteryInEnabledGroup(1L, "BAT-002")).thenReturn(1); when(testMapper.countRegisteredChannel(100L)).thenReturn(1); when(testMapper.countCollectorEnabled(8L)).thenReturn(1); when(testMapper.selectCollectorChannelCount(8L)).thenReturn(4); ServiceException exception = assertThrows(ServiceException.class, () -> testService.createTest(test)); assertEquals("同一检测柜通道不可重复绑定", exception.getMessage()); verify(testMapper, never()).insertTest(any(TTest.class)); } @Test void createShouldRejectDuplicateCollectorChannelMapping() { TTest test = validTest(); TTestBattery second = validBattery("BAT-002", 2L, 101L); test.setBatteries(java.util.List.of(test.getBatteries().get(0), second)); mockEnabledPeopleAndType(); when(testMapper.countBatteryInEnabledGroup(1L, "BAT-001")).thenReturn(1); when(testMapper.countBatteryInEnabledGroup(1L, "BAT-002")).thenReturn(1); when(testMapper.countRegisteredChannel(100L)).thenReturn(1); when(testMapper.countRegisteredChannel(101L)).thenReturn(1); when(testMapper.countCollectorEnabled(8L)).thenReturn(1); when(testMapper.selectCollectorChannelCount(8L)).thenReturn(4); ServiceException exception = assertThrows(ServiceException.class, () -> testService.createTest(test)); assertEquals("同一采集器通道不可重复映射", exception.getMessage()); verify(testMapper, never()).insertTest(any(TTest.class)); } @Test void createShouldRejectCaseInsensitiveDuplicateCollectorMeasurement() { TTest test = validTest(); test.getBatteries().get(0).getCollectorChannels() .add(collectorChannel("primary_temperature", "主温度重复", "S-04")); mockEnabledOptions(); ServiceException exception = assertThrows(ServiceException.class, () -> testService.createTest(test)); assertEquals("同一电池号的采集器测量项不可重复", exception.getMessage()); verify(testMapper, never()).insertTest(any(TTest.class)); } @Test void createShouldRejectBatteriesFromDifferentGroups() { TTest test = validTest(); TTestBattery otherGroup = validBattery("BAT-002", 2L, 101L); otherGroup.setGroupId(2L); test.setBatteries(java.util.List.of(test.getBatteries().get(0), otherGroup)); mockEnabledPeopleAndType(); when(testMapper.countBatteryInEnabledGroup(1L, "BAT-001")).thenReturn(1); when(testMapper.countRegisteredChannel(100L)).thenReturn(1); when(testMapper.countCollectorEnabled(8L)).thenReturn(1); when(testMapper.selectCollectorChannelCount(8L)).thenReturn(4); ServiceException exception = assertThrows(ServiceException.class, () -> testService.createTest(test)); assertEquals("同一测试只能选择一个电池组", exception.getMessage()); verify(testMapper, never()).insertTest(any(TTest.class)); } @Test void updateShouldRejectConfigurationAfterReceptionStarted() { TTest request = validTest(); request.setTestId(10L); TTest current = validTest(); current.setTestId(10L); current.setReceptionStatus("RECEIVING"); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); ServiceException exception = assertThrows(ServiceException.class, () -> testService.updateTest(request)); assertEquals("开始接收后不能修改测试配置", exception.getMessage()); verify(testMapper, never()).updateTest(any(TTest.class)); } @Test void createShouldRejectCollectorChannelOutsideRegisteredRange() { TTest test = validTest(); test.getBatteries().get(0).getCollectorChannels().get(2).setChannelCode("S-05"); mockEnabledPeopleAndType(); when(testMapper.countBatteryInEnabledGroup(1L, "BAT-001")).thenReturn(1); when(testMapper.countRegisteredChannel(100L)).thenReturn(1); when(testMapper.countCollectorEnabled(8L)).thenReturn(1); when(testMapper.selectCollectorChannelCount(8L)).thenReturn(4); ServiceException exception = assertThrows(ServiceException.class, () -> testService.createTest(test)); assertEquals("采集器通道不存在或超出登记范围", exception.getMessage()); verify(testMapper, never()).insertTest(any(TTest.class)); } @Test void updateShouldReplaceConfigurationBeforeMonitoringAndAppendAudit() { TTest request = validTest(); request.setTestId(10L); request.setMonitorTimeoutMinutes(45); TTest current = validTest(); current.setTestId(10L); current.setCreatorId(7L); current.setReceptionStatus("NOT_STARTED"); current.setMonitorTimeoutMinutes(30); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); when(testMapper.selectTestBatteries(10L)).thenReturn(current.getBatteries()); mockEnabledOptions(); when(testMapper.updateTest(request)).thenReturn(1); doAnswer(invocation -> { invocation.getArgument(0).setRelationId(21L); return 1; }).when(testMapper).insertTestBattery(any(TTestBattery.class)); assertEquals(1, testService.updateTest(request)); assertEquals(45, request.getMonitorTimeoutMinutes()); verify(testMapper).deleteTestBindingsByTestId(10L); } @Test void deleteBeforeMonitoringShouldAppendAudit() { TTest current = validTest(); current.setTestId(10L); current.setReceptionStatus("NOT_STARTED"); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); when(testMapper.deleteTestById(10L, "operator")).thenReturn(1); assertEquals(1, testService.deleteTestByIds(new Long[] { 10L }, 7L, "operator")); } @Test void deletesStartedTestAndAllChildFacts() { TTest current = validTest(); current.setTestId(10L); current.setTestStatus("RUNNING"); current.setReceptionStatus("NOT_STARTED"); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); when(testMapper.deleteTestById(10L, "operator")).thenReturn(1); assertEquals(1, testService.deleteTestByIds(new Long[] { 10L }, 7L, "operator")); verify(testMapper).deleteTestWarningExceptionsByTestId(10L); verify(testMapper).deleteTestDataRevisionActionsByTestId(10L); verify(testMapper).deleteTestLogicStepMappingsByTestId(10L); } @Test void startReceptionShouldPersistReceptionWithoutLegacyIntervals() { TTest current = validTest(); current.setTestId(10L); current.setTestStatus("WAITING"); current.setReceptionStatus("NOT_STARTED"); current.getBatteries().get(0).getBinding().setBindingId(30L); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); TDetectionChannel channel = new TDetectionChannel(); channel.setChannelId(100L); channel.setOnlineStatus("ONLINE"); channel.setLastSeenAtUtc(Instant.parse("2026-08-29T12:00:00Z")); when(testMapper.selectReceptionChannelForUpdate(100L)).thenReturn(channel); when(testMapper.countCollectorEnabled(8L)).thenReturn(1); when(testMapper.selectCollectorChannelCount(8L)).thenReturn(4); when(testMapper.updateReceptionStarted(eq(10L), any(), anyBoolean(), eq("operator"))).thenReturn(1); assertEquals(1, testService.startReception(10L, 7L, "operator")); } @Test void startReceptionShouldMarkRunningCabinetAttachmentWithoutControlCommand() { TTest current = validTest(); current.setTestId(10L); current.setTestStatus("WAITING"); current.setReceptionStatus("NOT_STARTED"); current.getBatteries().get(0).getBinding().setBindingId(30L); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); TDetectionChannel channel = new TDetectionChannel(); channel.setChannelId(100L); channel.setOnlineStatus("ONLINE"); channel.setWorkStatus("WORKING"); channel.setLastSeenAtUtc(Instant.parse("2026-08-29T12:00:00Z")); when(testMapper.selectReceptionChannelForUpdate(100L)).thenReturn(channel); when(testMapper.countCollectorEnabled(8L)).thenReturn(1); when(testMapper.selectCollectorChannelCount(8L)).thenReturn(4); when(testMapper.updateReceptionStarted(eq(10L), any(), anyBoolean(), eq("operator"))).thenReturn(1); assertEquals(1, testService.startReception(10L, 7L, "operator")); } @Test void startReceptionShouldNotDependOnDatabaseLease() { TTest current = validTest(); current.setTestId(10L); current.setTestStatus("WAITING"); current.setReceptionStatus("NOT_STARTED"); current.getBatteries().get(0).getBinding().setBindingId(30L); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); TDetectionChannel channel = new TDetectionChannel(); channel.setChannelId(100L); channel.setOnlineStatus("ONLINE"); channel.setLastSeenAtUtc(Instant.parse("2026-08-29T12:00:00Z")); when(testMapper.selectReceptionChannelForUpdate(100L)).thenReturn(channel); when(testMapper.countCollectorEnabled(8L)).thenReturn(1); when(testMapper.selectCollectorChannelCount(8L)).thenReturn(4); when(testMapper.updateReceptionStarted(eq(10L), any(), anyBoolean(), eq("operator"))).thenReturn(1); assertEquals(1, testService.startReception(10L, 7L, "operator")); } @Test void startReceptionShouldAllowOfflineSourcesWithoutBlockingReception() { TTest current = validTest(); current.setTestId(10L); current.setTestStatus("WAITING"); current.setReceptionStatus("NOT_STARTED"); current.getBatteries().get(0).getBinding().setBindingId(30L); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); TDetectionChannel channel = new TDetectionChannel(); channel.setChannelId(100L); channel.setOnlineStatus("OFFLINE"); when(testMapper.selectReceptionChannelForUpdate(100L)).thenReturn(channel); when(testMapper.countCollectorEnabled(8L)).thenReturn(1); when(testMapper.selectCollectorChannelCount(8L)).thenReturn(4); when(testMapper.updateReceptionStarted(eq(10L), any(), anyBoolean(), eq("operator"))).thenReturn(1); assertEquals(1, testService.startReception(10L, 7L, "operator")); } @Test void startReceptionShouldAllowOfflineCollectorWithoutBlockingReception() { TTest current = validTest(); current.setTestId(10L); current.setTestStatus("WAITING"); current.setReceptionStatus("NOT_STARTED"); current.getBatteries().get(0).getBinding().setBindingId(30L); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); TDetectionChannel channel = new TDetectionChannel(); channel.setChannelId(100L); channel.setOnlineStatus("ONLINE"); when(testMapper.selectReceptionChannelForUpdate(100L)).thenReturn(channel); when(testMapper.countCollectorEnabled(8L)).thenReturn(1); when(testMapper.selectCollectorChannelCount(8L)).thenReturn(4); when(testMapper.updateReceptionStarted(eq(10L), any(), anyBoolean(), eq("operator"))).thenReturn(1); assertEquals(1, testService.startReception(10L, 7L, "operator")); } @Test void startReceptionShouldRejectIncompleteCollectorMappingsBeforeWriting() { TTest current = validTest(); current.setTestId(10L); current.setTestStatus("WAITING"); current.setReceptionStatus("NOT_STARTED"); current.getBatteries().get(0).getBinding().setBindingId(30L); current.getBatteries().get(0).setCollectorChannels(Collections.emptyList()); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); TDetectionChannel channel = new TDetectionChannel(); channel.setChannelId(100L); channel.setOnlineStatus("ONLINE"); channel.setLastSeenAtUtc(Instant.parse("2026-08-29T12:00:00Z")); when(testMapper.selectReceptionChannelForUpdate(100L)).thenReturn(channel); when(testMapper.countCollectorEnabled(8L)).thenReturn(1); when(testMapper.selectCollectorChannelCount(8L)).thenReturn(4); ServiceException exception = assertThrows(ServiceException.class, () -> testService.startReception(10L, 7L, "operator")); assertEquals("每个电池号必须绑定主温度、正电位主通道和负电位主通道", exception.getMessage()); verify(testMapper, never()).updateReceptionStarted(any(), any(), anyBoolean(), any()); } @Test void startReceptionShouldRejectMissingOperatorExplicitly() { ServiceException exception = assertThrows(ServiceException.class, () -> testService.startReception(10L, null, "operator")); assertEquals("操作人不能为空", exception.getMessage()); verify(testMapper, never()).selectTestByIdForUpdate(anyLong()); } @Test void startReceptionShouldRejectMismatchedTestAndReceptionStates() { TTest current = validTest(); current.setTestId(10L); current.setTestStatus("COMPLETED"); current.setReceptionStatus("NOT_STARTED"); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); ServiceException exception = assertThrows(ServiceException.class, () -> testService.startReception(10L, 7L, "operator")); assertEquals("当前测试不是未开始接收状态", exception.getMessage()); verify(testMapper, never()).updateReceptionStarted(any(), any(), anyBoolean(), any()); } @Test void pauseReceptionShouldRejectMismatchedTestAndReceptionStates() { TTest current = validTest(); current.setTestId(10L); current.setTestStatus("PAUSED"); current.setReceptionStatus("RECEIVING"); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); ServiceException exception = assertThrows(ServiceException.class, () -> testService.pauseReception(10L, 7L, "operator")); assertEquals("当前测试不是接收中状态", exception.getMessage()); verify(testMapper, never()).updateReceptionPaused(any(), any(), any()); } @Test void pauseReceptionShouldStopPollingAndAppendAudit() { TTest current = validTest(); current.setTestId(10L); current.setTestStatus("RUNNING"); current.setReceptionStatus("RECEIVING"); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); when(testMapper.updateReceptionPaused(eq(10L), eq("operator"), any())).thenReturn(1); assertEquals(1, testService.pauseReception(10L, 7L, "operator")); verify(testMapper).updateReceptionPaused(eq(10L), eq("operator"), any()); } @Test void resumeReceptionShouldRestartPollingAndAppendAudit() { TTest current = validTest(); current.setTestId(10L); current.setTestStatus("PAUSED"); current.setReceptionStatus("PAUSED"); List configuredBatteries = current.getBatteries(); current.setBatteries(null); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); when(testMapper.selectTestBatteries(10L)).thenReturn(configuredBatteries); when(testMapper.updateReceptionResumed(eq(10L), eq("operator"), any())).thenReturn(1); assertEquals(1, testService.resumeReception(10L, 7L, "operator")); verify(testMapper).updateReceptionResumed(eq(10L), eq("operator"), any()); } @Test void stopTestShouldCompleteWithoutLegacyLeaseCleanup() { TTest current = validTest(); current.setTestId(10L); current.setTestStatus("PAUSED"); current.setReceptionStatus("PAUSED"); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); when(testMapper.updateReceptionStopped(eq(10L), eq("operator"), any())).thenReturn(1); assertEquals(1, testService.stopTest(10L, 7L, "operator")); verify(testMapper).updateReceptionStopped(eq(10L), eq("operator"), any()); } @Test void stopTestShouldAuditImmediateStop() { TTest current = validTest(); current.setTestId(10L); current.setTestStatus("RUNNING"); current.setReceptionStatus("RECEIVING"); when(testMapper.selectTestByIdForUpdate(10L)).thenReturn(current); when(testMapper.updateReceptionStopped(eq(10L), eq("operator"), any())).thenReturn(1); testService.stopTest(10L, 7L, "operator"); } private void mockEnabledOptions() { mockEnabledPeopleAndType(); when(testMapper.countBatteryInEnabledGroup(1L, "BAT-001")).thenReturn(1); when(testMapper.countRegisteredChannel(100L)).thenReturn(1); when(testMapper.countCollectorEnabled(8L)).thenReturn(1); when(testMapper.selectCollectorChannelCount(8L)).thenReturn(4); } private void mockEnabledPeopleAndType() { when(testMapper.countUserEnabled(7L)).thenReturn(1); when(testMapper.countUserEnabled(9L)).thenReturn(1); when(testMapper.countTestTypeEnabled(3L)).thenReturn(1); } private TTest validTest() { TTestWarningThreshold threshold = new TTestWarningThreshold(); threshold.setMetricCode("VOLTAGE"); threshold.setMinValue(new BigDecimal("2.5")); threshold.setMaxValue(new BigDecimal("4.2")); threshold.setUnit("V"); threshold.setSeverity("WARNING"); TTest test = new TTest(); test.setTestName("低温循环测试"); test.setCreatorId(7L); test.setOperatorId(7L); test.setCreateBy("creator"); test.setUpdateBy("creator"); test.setPrincipalId(9L); test.setTestTypeId(3L); test.setTestPurpose("验证低温循环性能"); test.setTestStatus("WAITING"); test.setReceptionStatus("NOT_STARTED"); test.setMonitorTimeoutMinutes(30); test.setBatteries(Collections.singletonList(validBattery("BAT-001", 1L, 100L))); test.setThresholds(Collections.singletonList(threshold)); return test; } private TTestBattery validBattery(String batteryNo, Long relationId, Long channelId) { TTestChannelBinding binding = new TTestChannelBinding(); binding.setChannelId(channelId); binding.setExpectedBarcode("CODE-" + batteryNo); TTestBattery battery = new TTestBattery(); battery.setRelationId(relationId); battery.setGroupId(1L); battery.setBatteryNo(batteryNo); battery.setCollectorId(8L); battery.setBinding(binding); battery.setCollectorChannels(new java.util.ArrayList<>(java.util.List.of( collectorChannel("PRIMARY_TEMPERATURE", "主温度", "S-01"), collectorChannel("PRIMARY_POSITIVE_POTENTIAL", "正电位主通道", "S-02"), collectorChannel("PRIMARY_NEGATIVE_POTENTIAL", "负电位主通道", "S-03")))); battery.setFields(Collections.emptyList()); return battery; } private TTestCollectorChannel collectorChannel(String measurementCode, String measurementName, String channelCode) { TTestCollectorChannel mapping = new TTestCollectorChannel(); mapping.setMeasurementCode(measurementCode); mapping.setMeasurementName(measurementName); mapping.setChannelCode(channelCode); return mapping; } }