Bladeren bron

Merge remote-tracking branch 'origin/main'

# Conflicts:
#	device-service-server/src/main/resources/application.yml
#	device-service-server/src/main/resources/bootstrap.yml
#	pom.xml
yangliu 3 maanden geleden
bovenliggende
commit
fbfff19240

+ 36 - 0
device-service-application/src/test/java/com/hfln/device/application/service/impl/DeviceCommandServiceImplTest.java

@@ -0,0 +1,36 @@
+package com.hfln.device.application.service.impl;
+
+import com.hfln.device.domain.service.DeviceManagerService;
+import com.hfln.device.domain.gateway.MqttGateway;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import static org.mockito.Mockito.*;
+
+class DeviceCommandServiceImplTest {
+    @Mock
+    DeviceManagerService deviceManagerService;
+    @Mock
+    MqttGateway mqttGateway;
+    @InjectMocks
+    DeviceCommandServiceImpl deviceCommandService;
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+    }
+    @Test
+    void testHandleGetDeviceInfoRequest() {
+        String payload = "{\"dev_id\":\"dev001\"}";
+        // 可根据实际业务补充mock和断言
+        deviceCommandService.handleGetDeviceInfoRequest(payload);
+        // verify相关依赖被调用
+    }
+    @Test
+    void testHandleSetDeviceParamMps() {
+        String payload = "{\"dev_id\":\"dev001\"}";
+        deviceCommandService.handleSetDeviceParamMps(payload);
+        // verify相关依赖被调用
+    }
+} 

+ 40 - 0
device-service-application/src/test/java/com/hfln/device/application/service/impl/DeviceEventServiceImplTest.java

@@ -0,0 +1,40 @@
+package com.hfln.device.application.service.impl;
+
+import com.hfln.device.domain.entity.Device;
+import com.hfln.device.domain.service.DeviceManagerService;
+import com.hfln.device.domain.gateway.MqttGateway;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import java.util.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+class DeviceEventServiceImplTest {
+    @Mock
+    DeviceManagerService deviceManagerService;
+    @Mock
+    MqttGateway mqttGateway;
+    @InjectMocks
+    DeviceEventServiceImpl deviceEventService;
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+    }
+    @Test
+    void testHandlePoseDistribution() {
+        Device device = new Device("dev001");
+        when(deviceManagerService.getDeviceFromCache("dev001")).thenReturn(Optional.of(device));
+        Map<String, Object> distribution = new HashMap<>();
+        distribution.put("pose", 4);
+        deviceEventService.handlePoseDistribution("dev001", distribution, System.currentTimeMillis());
+        verify(deviceManagerService, atLeastOnce()).updateDeviceInCache(device);
+        assertEquals(4, device.getRealtimePose().get(0));
+    }
+    @Test
+    void testHandleDeviceEvent() {
+        // 可根据实际方法签名补充
+    }
+} 

+ 159 - 0
device-service-application/src/test/java/com/hfln/device/application/service/impl/PoseAnalysisServiceImplTest.java

@@ -0,0 +1,159 @@
+package com.hfln.device.application.service.impl;
+
+import com.hfln.device.application.service.PoseAnalysisService;
+import com.hfln.device.domain.entity.Device;
+import com.hfln.device.domain.gateway.MqttGateway;
+import com.hfln.device.domain.service.DeviceManagerService;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.*;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+class PoseAnalysisServiceImplTest {
+
+    @Mock
+    private DeviceManagerService deviceManagerService;
+    @Mock
+    private MqttGateway mqttGateway;
+    @Mock
+    private RestTemplate restTemplate;
+
+    @InjectMocks
+    private PoseAnalysisServiceImpl poseAnalysisService;
+
+    private AutoCloseable closeable;
+
+    @BeforeEach
+    void setUp() {
+        closeable = MockitoAnnotations.openMocks(this);
+        poseAnalysisService = new PoseAnalysisServiceImpl();
+        poseAnalysisService.deviceManagerService = deviceManagerService;
+        poseAnalysisService.mqttGateway = mqttGateway;
+        poseAnalysisService.restTemplate = restTemplate;
+        // 设置默认参数
+        poseAnalysisService.modelType = "LIBO";
+        poseAnalysisService.poseClass = "POSE_CLASS_4";
+    }
+
+    @AfterEach
+    void tearDown() throws Exception {
+        closeable.close();
+        poseAnalysisService.stopPoseAnalysisThread();
+    }
+
+    @Test
+    void testDealPostData_LiboModel() {
+        List<List<Float>> rawPoints = Arrays.asList(
+                Arrays.asList(1.1f, 2.2f, 3.3f, 4.4f),
+                Arrays.asList(5.5f, 6.6f, 7.7f, 8.8f)
+        );
+        Map<String, Object> result = poseAnalysisService.dealPostData(rawPoints);
+        assertTrue(result.containsKey("point_cloud"));
+        List<List<Float>> pc = (List<List<Float>>) result.get("point_cloud");
+        assertEquals(2, pc.size());
+        assertEquals(Arrays.asList(1.1f, 2.2f, 3.3f), pc.get(0));
+    }
+
+    @Test
+    void testDealPostData_AndaModel() {
+        poseAnalysisService.modelType = "ANDA";
+        List<List<Float>> rawPoints = Arrays.asList(
+                Arrays.asList(1.1f, 2.2f, 3.3f, 4.4f)
+        );
+        Map<String, Object> result = poseAnalysisService.dealPostData(rawPoints);
+        assertTrue(result.containsKey("Payload"));
+        Map<String, Object> payload = (Map<String, Object>) result.get("Payload");
+        assertTrue(payload.containsKey("raw_points"));
+    }
+
+    @Test
+    void testCheckPose_LiboClass4() {
+        poseAnalysisService.modelType = "LIBO";
+        poseAnalysisService.poseClass = "POSE_CLASS_4";
+        assertEquals(2, poseAnalysisService.checkPose(2));
+        assertEquals(4, poseAnalysisService.checkPose(4));
+    }
+
+    @Test
+    void testCheckPose_LiboClass3() {
+        poseAnalysisService.modelType = "LIBO";
+        poseAnalysisService.poseClass = "POSE_CLASS_3";
+        assertEquals(4, poseAnalysisService.checkPose(2)); // 2->4
+        assertEquals(1, poseAnalysisService.checkPose(1));
+    }
+
+    @Test
+    void testCheckPose_Anda() {
+        poseAnalysisService.modelType = "ANDA";
+        assertEquals(3, poseAnalysisService.checkPose(3));
+    }
+
+    @Test
+    void testCheckPoseFromResponse() {
+        Map<String, Object> resp = new HashMap<>();
+        resp.put("predicted_class", 2);
+        poseAnalysisService.modelType = "LIBO";
+        poseAnalysisService.poseClass = "POSE_CLASS_4";
+        assertEquals(2, poseAnalysisService.checkPoseFromResponse(resp));
+    }
+
+    @Test
+    void testStartAndStopPoseAnalysisThread() throws InterruptedException {
+        poseAnalysisService.startPoseAnalysisThread();
+        assertTrue(poseAnalysisService.running.get());
+        poseAnalysisService.stopPoseAnalysisThread();
+        Thread.sleep(100); // 等待线程停止
+        assertFalse(poseAnalysisService.running.get());
+    }
+
+    @Test
+    void testPoseAnalysisProcess_MockDeviceAndRest() throws InterruptedException {
+        // 构造一个带点云的设备
+        Device device = mock(Device.class);
+        when(device.getMaxLenCloudPoints()).thenReturn(Arrays.asList(
+                Arrays.asList(1.0f, 2.0f, 3.0f),
+                Arrays.asList(4.0f, 5.0f, 6.0f)
+        ));
+        when(device.getDevId()).thenReturn("dev001");
+        when(device.getRealtimePose()).thenReturn(Arrays.asList(0));
+        when(device.getAlarmAck()).thenReturn(false);
+        when(device.getLastReportFallTime()).thenReturn(null);
+        when(device.getAlarmInterval()).thenReturn(0L);
+        doNothing().when(device).updatePose(anyInt());
+        doNothing().when(device).setLastFallTime(anyString(), anyLong());
+
+        Collection<Device> devices = Collections.singletonList(device);
+        when(deviceManagerService.getAllDevicesFromCache()).thenReturn(devices);
+
+        // mock restTemplate返回AI响应
+        Map<String, Object> aiResp = new HashMap<>();
+        aiResp.put("predicted_class", 0);
+        when(restTemplate.postForObject(anyString(), any(), eq(Map.class))).thenReturn(aiResp);
+
+        // mock mqttGateway
+        doNothing().when(mqttGateway).sendEventMessage(anyString(), any(), anyInt(), any(), anyString());
+
+        // 启动线程,运行一次循环
+        poseAnalysisService.running.set(true);
+        Thread t = new Thread(() -> {
+            poseAnalysisService.poseAnalysisProcess();
+        });
+        t.start();
+        Thread.sleep(300); // 让线程跑一会
+        poseAnalysisService.running.set(false);
+        t.interrupt();
+        t.join(500);
+        // 验证AI服务和消息发送被调用
+        verify(restTemplate, atLeastOnce()).postForObject(anyString(), any(), eq(Map.class));
+        verify(mqttGateway, atLeastOnce()).sendEventMessage(anyString(), any(), anyInt(), any(), anyString());
+    }
+} 

+ 37 - 0
device-service-application/src/test/java/com/hfln/device/application/task/DeviceStatusCheckTaskTest.java

@@ -0,0 +1,37 @@
+package com.hfln.device.application.task;
+
+import com.hfln.device.domain.entity.Device;
+import com.hfln.device.domain.service.DeviceManagerService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import java.util.*;
+import static org.mockito.Mockito.*;
+
+class DeviceStatusCheckTaskTest {
+    @Mock
+    DeviceManagerService deviceManagerService;
+    @InjectMocks
+    DeviceStatusCheckTask deviceStatusCheckTask;
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+    }
+    @Test
+    void testCheckDeviceKeepAlive() {
+        Device device = new Device("dev001");
+        device.setKeepaliveTime(System.currentTimeMillis() - 100000);
+        when(deviceManagerService.getAllDevicesFromCache()).thenReturn(Collections.singletonList(device));
+        deviceStatusCheckTask.checkDeviceKeepAlive();
+        // 可根据业务补充verify
+    }
+    @Test
+    void testCheckAllDeviceAlarmPlan() {
+        Device device = new Device("dev001");
+        when(deviceManagerService.getAllDevicesFromCache()).thenReturn(Collections.singletonList(device));
+        deviceStatusCheckTask.checkAllDeviceAlarmPlan();
+        // 可根据业务补充verify
+    }
+} 

+ 13 - 0
device-service-server/pom.xml

@@ -59,6 +59,19 @@
             <scope>runtime</scope>
         </dependency>
 
+
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>druid-spring-boot-starter</artifactId>

+ 0 - 0
device-service-server/src/main/resources/bootstrap-dev.yml → device-service-server/src/main/resources/application-dev.yml


+ 0 - 0
device-service-server/src/main/resources/bootstrap-local.yml → device-service-server/src/main/resources/application-local.yml


+ 0 - 0
device-service-server/src/main/resources/bootstrap-prod.yml → device-service-server/src/main/resources/application-prod.yml


+ 0 - 0
device-service-server/src/main/resources/bootstrap-test.yml → device-service-server/src/main/resources/application-test.yml


+ 1 - 1
device-service-server/src/main/resources/bootstrap.yml

@@ -31,4 +31,4 @@ mybatis-plus:
     db-config:
       logic-delete-field: del_flag
       logic-delete-value: 1
-      logic-not-delete-value: 0 
+      logic-not-delete-value: 0