From 7bdd2edfec84ad02dbb6cb59e6e9fde8e6a802b0 Mon Sep 17 00:00:00 2001
From: zhouhn <zhouhn@xiaopeng.com>
Date: 星期六, 07 三月 2026 20:58:29 +0800
Subject: [PATCH] 更新XPUUtil的单元测试

---
 xp-robotaxi-automatic-pilot-boot/src/test/java/com/xiaopeng/automaticPilot/util/XPUUtilTest.java                  |  155 +++++++++++++++++++++++++++++++++++++++++++++++++++
 xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java                      |    2 
 xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java      |    1 
 xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java                                 |    1 
 xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java |    1 
 5 files changed, 157 insertions(+), 3 deletions(-)

diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
index d77f751..ce9d724 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -40,6 +40,7 @@
     @PostMapping("/inner/pushOrder")
     public R<Boolean> pushOrder(@RequestBody PushOrderDto dto) {
         RTTask task = new RTTask();
+        //TODO 设置目标地点信息
         task.setOrder_id(dto.getOrderId().toString());
         task.setTask_id("MISSION_"+ IdUtil.fastUUID());
         task.setTask_type(TaskType.ROBOTAXI);
diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
index d52dcaf..2eebd64 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -511,6 +511,7 @@
             dto.setOrderId(Long.parseLong(orderId));
             dto.setOrigin(origin);
             dto.setDestination(destination);
+            //TODO 这里的routeID不应该每次都重新生成,应该有一个缓存,调用的接口有做缓存但是没有读取缓存
             R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto);
             if (200 != routeVoR.getCode()) {
                 throw new RuntimeException("获取订单线路和运费失败");
diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java
index e718051..7187e2f 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java
@@ -59,7 +59,7 @@
         header.setTimestamp(System.currentTimeMillis());
         header.setCmd(RTCmdType.CLOUD_CREATE_ORDER);
         header.setSequence(sequence);
-        header.setType(MessageType.MESSAGE_TYPE_RESPONSE);
+        header.setType(MessageType.MESSAGE_TYPE_REQUEST);
         header.setSource(SourceType.CLOUD);
         msgContent.setHeader(header);
         // 消息内容
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/java/com/xiaopeng/automaticPilot/util/XPUUtilTest.java b/xp-robotaxi-automatic-pilot-boot/src/test/java/com/xiaopeng/automaticPilot/util/XPUUtilTest.java
index 176cb0b..e9f9fe0 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/test/java/com/xiaopeng/automaticPilot/util/XPUUtilTest.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/java/com/xiaopeng/automaticPilot/util/XPUUtilTest.java
@@ -1,9 +1,19 @@
 package com.xiaopeng.automaticPilot.util;
 
+import com.xiaopeng.api.dto.automaticPilot.MqttPublishDto;
 import com.xiaopeng.api.feignClient.automaticPilot.VmpOpenServiceClient;
+import com.xiaopeng.api.feignClient.automaticPilot.XPUClient;
+import com.xiaopeng.api.vo.automaticPilot.MqttPublishVo;
+import com.xiaopeng.api.vo.automaticPilot.proto.down.GeoPoint;
+import com.xiaopeng.api.vo.automaticPilot.proto.down.ResponseMessage;
+import com.xiaopeng.api.vo.automaticPilot.proto.down.StatusCode;
+import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudCreateOrder.*;
+import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudOrderOperation.*;
+import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudPushNavigation.RestoreNavigationData;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
 
 import java.lang.reflect.Field;
@@ -15,18 +25,34 @@
 public class XPUUtilTest {
 
     private XPUUtil xpuUtil;
+    private XPUClient xpuClient;
+    private VmpOpenServiceClient vmpClient;
 
     @BeforeEach
     public void setUp() throws Exception {
         xpuUtil = new XPUUtil();
-        VmpOpenServiceClient vmpClient = Mockito.mock(VmpOpenServiceClient.class);
+        
+        // Mock VmpOpenServiceClient
+        vmpClient = Mockito.mock(VmpOpenServiceClient.class);
         Map<String, String> mapping = new HashMap<>();
         mapping.put(XPUUtil.XPU_ID_TYPE, "1234567890ABCDEFGHIJKL");
         Mockito.when(vmpClient.getVehicleBindInfoByVin(Mockito.anyString(), Mockito.anyList()))
                 .thenReturn(mapping);
+        
+        // Mock XPUClient
+        xpuClient = Mockito.mock(XPUClient.class);
+        Mockito.when(xpuClient.publish(Mockito.any(MqttPublishVo.class)))
+                .thenReturn(new MqttPublishDto());
+
+        // Inject mocks
         Field vmpField = XPUUtil.class.getDeclaredField("vmpOpenServiceClient");
         vmpField.setAccessible(true);
         vmpField.set(xpuUtil, vmpClient);
+
+        Field xpuClientField = XPUUtil.class.getDeclaredField("xpuClient");
+        xpuClientField.setAccessible(true);
+        xpuClientField.set(xpuUtil, xpuClient);
+
         Field topicField = XPUUtil.class.getDeclaredField("topicPrefix");
         topicField.setAccessible(true);
         topicField.set(xpuUtil, "Robotaxi/Msg/Xpu");
@@ -39,5 +65,130 @@
         String result = (String) buildTopic.invoke(xpuUtil, "VIN123");
         Assertions.assertEquals("Robotaxi/Msg/Xpu/ABCDEFGHIJKL00000000", result);
     }
-}
 
+    @Test
+    public void testCloudCreateOrder() {
+        String orderId = "1881347710714060802";
+
+        RTTask task = new RTTask();
+        task.setTask_id("task-123");
+        task.setOrder_id(orderId);
+        task.setVin("VIN12345678900000");
+        task.setTask_type(TaskType.ROBOTAXI);
+        task.setStatus(TaskStatus.PENDING);
+        
+        NavigationWaypoint point = new NavigationWaypoint();
+        point.setType(WaypointType.START_POINT);
+        point.setAction(WaypointAction.PICK_UP);
+        point.setSequence(1);
+        GeoPoint geoPoint = new GeoPoint();
+        geoPoint.setLatitude(30.0);
+        geoPoint.setLongitude(120.0);
+        geoPoint.setPoi_name("Start Point");
+        point.setPoint(geoPoint);
+        
+        task.setPoints(Collections.singletonList(point));
+
+        String vin = "VIN12345678900000";
+        Long sequence = 1L;
+
+        xpuUtil.cloudCreateOrder(task, vin, sequence);
+
+        ArgumentCaptor<MqttPublishVo> captor = ArgumentCaptor.forClass(MqttPublishVo.class);
+        Mockito.verify(xpuClient).publish(captor.capture());
+        MqttPublishVo capturedVo = captor.getValue();
+        
+        Assertions.assertEquals("Robotaxi/Msg/Xpu/ABCDEFGHIJKL00000000", capturedVo.getTopic());
+        // Note: Current implementation serializes enum as ordinal. CLOUD_CREATE_ORDER is ordinal 2.
+        Assertions.assertTrue(capturedVo.getPayload().contains("\"cmd\":2"), "Payload should contain cmd CLOUD_CREATE_ORDER (ordinal 2), but was: " + capturedVo.getPayload());
+    }
+
+    @Test
+    public void testCloudOrderOperation() {
+        String orderId = "1881347710714060802";
+
+        OrderOperation operation = new OrderOperation();
+        operation.setOrder_id(orderId);
+        operation.setTask_id("task-123");
+        operation.setOperation_type(OrderOperationType.CLOUD_CREATE_ORDER);
+        operation.setOrder_type(OrderType.ROBOTAXI);
+        
+        Waypoint waypoint = new Waypoint();
+        waypoint.setWaypoint_id("wp-1");
+        waypoint.setPoint_type(PointType.WAY_POINT);
+        waypoint.setAction_type(ActionType.WAIT);
+        waypoint.setSequence(2);
+        
+        GeoPoint geoPoint = new GeoPoint();
+        geoPoint.setLatitude(30.1);
+        geoPoint.setLongitude(120.1);
+        geoPoint.setPoi_name("Way Point");
+        waypoint.setPoint(geoPoint);
+        
+        operation.setWaypoints(Collections.singletonList(waypoint));
+        
+        TargetPoint targetPoint = new TargetPoint();
+        GeoPoint endGeoPoint = new GeoPoint();
+        endGeoPoint.setLatitude(30.2);
+        endGeoPoint.setLongitude(120.2);
+        endGeoPoint.setPoi_name("End Point");
+        targetPoint.setPoint(endGeoPoint);
+        operation.setTarget_point(targetPoint);
+
+        String vin = "VIN12345678900000";
+        Long sequence = 2L;
+
+        xpuUtil.cloudOrderOperation(operation, vin, sequence);
+
+        ArgumentCaptor<MqttPublishVo> captor = ArgumentCaptor.forClass(MqttPublishVo.class);
+        Mockito.verify(xpuClient).publish(captor.capture());
+        MqttPublishVo capturedVo = captor.getValue();
+        
+        Assertions.assertEquals("Robotaxi/Msg/Xpu/ABCDEFGHIJKL00000000", capturedVo.getTopic());
+        // Note: CLOUD_ORDER_OPERATION is ordinal 0.
+        Assertions.assertTrue(capturedVo.getPayload().contains("\"cmd\":0"), "Payload should contain cmd CLOUD_ORDER_OPERATION (ordinal 0), but was: " + capturedVo.getPayload());
+    }
+
+    @Test
+    public void testResponseMessage() {
+        ResponseMessage responseMessage = new ResponseMessage();
+        responseMessage.setRequest_seq(12345L);
+        responseMessage.setCode(StatusCode.OK);
+        responseMessage.setTimestamp(System.currentTimeMillis());
+
+        String vin = "VIN12345678900000";
+
+        xpuUtil.responseMessage(responseMessage, vin);
+
+        ArgumentCaptor<MqttPublishVo> captor = ArgumentCaptor.forClass(MqttPublishVo.class);
+        Mockito.verify(xpuClient).publish(captor.capture());
+        MqttPublishVo capturedVo = captor.getValue();
+        
+        Assertions.assertEquals("Robotaxi/Msg/Xpu/ABCDEFGHIJKL00000000", capturedVo.getTopic());
+        // Note: CLOUD_TASK_CONTROL is ordinal 1.
+        Assertions.assertTrue(capturedVo.getPayload().contains("\"cmd\":1"), "Payload should contain cmd CLOUD_TASK_CONTROL (ordinal 1), but was: " + capturedVo.getPayload());
+    }
+
+    @Test
+    public void testCloudPushNavigation() {
+        RestoreNavigationData navigationData = new RestoreNavigationData();
+        navigationData.setRequest_id("req-123");
+        navigationData.setRoute_id("5939fa259ad6479cbdf8871ceed96b72");
+        String content = "{\"startPoint\":{\"location\":\"116.481028,39.989643\"},\"endPoint\":{\"location\":\"116.465302,40.004717\"},\"routeID\":\"xxxxxxxxxxxxx\",\"strategy\":17,\"type\":1,\"ferry\":0,\"disableEndDispatch\":1,\"viaInfo\":[{},{}],\"routeUserType\":2,\"bizScene\":2,\"plate\":\"京A12345\",\"vehicleType\":1}";
+        navigationData.setContent(content);
+        navigationData.setTimestamp(System.currentTimeMillis());
+
+        String xpuId = "1234567890ABCDEFGHIJKL";
+        Long sequence = 3L;
+
+        xpuUtil.cloudPushNavigation(navigationData, xpuId, sequence);
+
+        ArgumentCaptor<MqttPublishVo> captor = ArgumentCaptor.forClass(MqttPublishVo.class);
+        Mockito.verify(xpuClient).publish(captor.capture());
+        MqttPublishVo capturedVo = captor.getValue();
+        
+        Assertions.assertEquals("Robotaxi/Msg/Xpu/ABCDEFGHIJKL00000000", capturedVo.getTopic());
+        // Note: CLOUD_NAVIGATION_RESPONSE is ordinal 5.
+        Assertions.assertTrue(capturedVo.getPayload().contains("\"cmd\":5"), "Payload should contain cmd CLOUD_NAVIGATION_RESPONSE (ordinal 5), but was: " + capturedVo.getPayload());
+    }
+}
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java
index e09217c..f290cd1 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/utils/GDMapGeocodingUtil.java
@@ -69,6 +69,7 @@
         String data = jsonObject.getString("data");
 
         JSONObject jsonObject1 = JSON.parseObject(data);
+        //TODO routeId的逻辑提取逻辑还没改
         String routeID = jsonObject1.getString("routeID");
         JSONArray path = jsonObject1.getJSONArray("paths");
         for (Object o : path) {

--
Gitblit v1.7.1