zhuml4
2026-03-02 fc7d601e8e04f4cb73a57bd1bd6eac86a1ec2187
更新配置&XPU单元测试
1个文件已添加
5个文件已修改
268 ■■■■■ 已修改文件
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/KafkaTestController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/resources/bootstrap.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/test/java/com/xiaopeng/automaticPilot/controller/KafkaTestControllerTest.java 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/resources/application-local.yml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/resources/bootstrap.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/KafkaTestController.java
@@ -3,7 +3,8 @@
import com.xiaopeng.automaticPilot.service.KafkaConsumerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@@ -14,24 +15,28 @@
    private KafkaConsumerService kafkaConsumerService;
    //TODO 少了factory属性声明
    /**
     * 消费消息 - XPU上报Robotaxi云端的消息topic(高优先级)
     *
     * @param message 消息内容
     */
    @KafkaListener(topics = "topic-prod-robotaxi-xpu-high", groupId = "group-robotaxi-xpu")
    public void topicProdRobotaxiXpuHigh(String message) {
//    @KafkaListener(topics = "topic-prod-robotaxi-xpu-high", groupId = "group-robotaxi-xpu")
    @PostMapping("/test/kafka/xpu-high")
    public void topicProdRobotaxiXpuHigh(@RequestBody String message) {
        log.info("收到XPU上报高优先级主题消息: {}", message);
        kafkaConsumerService.topicProdRobotaxiXpuHigh(message);
    }
    //TODO 少了factory属性声明
    /**
     * 消费消息 - XPU上报Robotaxi云端的消息topic(低优先级)
     *
     * @param message 消息内容
     */
    @KafkaListener(topics = "topic-prod-robotaxi-xpu-normal", groupId = "group-robotaxi-xpu")
//    @KafkaListener(topics = "topic-prod-robotaxi-xpu-normal", groupId = "group-robotaxi-xpu")
    @PostMapping("/test/kafka/xpu-normal")
    public void topicProdRobotaxiXpuNormal(String message) {
        log.info("收到XPU上报低优先级主题消息: {}", message);
        kafkaConsumerService.topicProdRobotaxiXpuNormal(message);
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java
@@ -40,7 +40,9 @@
    // 查询车管 车辆xpuid信息返回字段,用于按需返回字段
    public static final List<String> TYPE_LIST = Collections.singletonList("1");
    private static final com.google.protobuf.util.JsonFormat.Printer jsonPrinter = com.google.protobuf.util.JsonFormat.printer().printingEnumsAsInts();
    private static final com.google.protobuf.util.JsonFormat.Printer jsonPrinter = com.google.protobuf.util.JsonFormat.printer()
            .printingEnumsAsInts()
            .preservingProtoFieldNames();
    /**
     * Robotaxi创建订单推送给XPU
xp-robotaxi-automatic-pilot-boot/src/main/resources/bootstrap.yml
@@ -1,7 +1,7 @@
server:
  port: 6020
  tomcat:
    basedir: /data/tomcat
    basedir: data/tomcat
# Spring
spring:
  application:
xp-robotaxi-automatic-pilot-boot/src/test/java/com/xiaopeng/automaticPilot/controller/KafkaTestControllerTest.java
New file
@@ -0,0 +1,235 @@
package com.xiaopeng.automaticPilot.controller;
import com.xiaopeng.api.feignClient.map.XpMapClient;
import com.xiaopeng.api.feignClient.operation.ReassignOrderClient;
import com.xiaopeng.api.feignClient.operation.XpCruisePlanClient;
import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient;
import com.xiaopeng.api.feignClient.order.XpOrderClient;
import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.automaticPilot.service.KafkaConsumerService;
import com.xiaopeng.automaticPilot.util.XPUUtil;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.redis.service.RedisService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.redis.core.GeoOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.test.util.ReflectionTestUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import static org.mockito.Mockito.*;
/**
 * KafkaTestController 单元测试
 */
@Slf4j
@DisplayName("Kafka测试控制器单元测试")
@ExtendWith(MockitoExtension.class)
public class KafkaTestControllerTest {
    @Mock
    private XpVehicleClient xpVehicleClient;
    @Mock
    private XpMapClient xpMapClient;
    @Mock
    private XpOrderClient xpOrderClient;
    @Mock
    private MongoTemplate mongoTemplate;
    @Mock
    private XPUUtil xpuUtil;
    @Mock
    private RedisTemplate redisTemplate;
    @Mock
    private XpPushMessageClient xpPushMessageClient;
    @Mock
    private ReassignOrderClient reassignOrderClient;
    @Mock
    private UserVehicleClient userVehicleClient;
    @Mock
    private XpCruiseOrderClient xpCruiseOrderClient;
    @Mock
    private RedisService redisService;
    @Mock
    private XpCruisePlanClient xpCruisePlanClient;
    @Mock
    private ValueOperations valueOperations;
    @Mock
    private GeoOperations geoOperations;
    @InjectMocks
    private KafkaConsumerService kafkaConsumerService;
    @Spy
    @InjectMocks
    private KafkaTestController kafkaTestController;
    @Mock
    private R<XpVehicle> mockResponseResult;
    @Mock
    private R<XpOrder> mockOrderResponseResult;
    // 模拟的XpVehicle对象
    private XpVehicle mockXpVehicle;
    @BeforeEach
    public void setUp() {
        // 将包含所有 mock 依赖的 kafkaConsumerService 注入到 kafkaTestController
        ReflectionTestUtils.setField(kafkaTestController, "kafkaConsumerService", kafkaConsumerService);
    }
    /**
     * 从本地文件读取JSON内容
     *
     * @param filePath 文件路径
     * @return JSON字符串
     * @throws IOException 如果文件读取失败
     */
    private String readJsonFile(String filePath) throws IOException {
        return new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
    }
    @Test
    @DisplayName("测试XPU发生系统运行状态")
    public void testXpuSendSystemRuntimeStatus() throws IOException {
        // 从本地文件读取测试数据
        String testMessage = readJsonFile("src/test/resources/jsondemo/common/system_runtime_status.json");
        mockXpVehicle = new XpVehicle();
        mockXpVehicle.setXpuId("xpu-001");
        mockXpVehicle.setVehicleVin("test-vin");
        when(mockResponseResult.getData()).thenReturn(mockXpVehicle);
        when(xpVehicleClient.findByVehicleXpuId(anyString())).thenReturn(mockResponseResult);
        // mock redisTemplate 的 geo 和 value 操作,避免空指针
        when(redisTemplate.opsForGeo()).thenReturn(geoOperations);
        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
        // 执行测试
        kafkaTestController.topicProdRobotaxiXpuHigh(testMessage);
    }
    @Test
    @DisplayName("测试XPU发送导航请求")
    public void testXPUSendNavigationRequest() throws IOException {
        // 从本地文件读取测试数据
        String testMessage = readJsonFile("src/test/resources/jsondemo/cloud/navigation_requset.json");
        XpOrder mockOrder = new XpOrder();
        mockOrder.setId(1881347710714060802L);
        mockOrder.setVehicleId(1L);
        when(mockOrderResponseResult.getCode()).thenReturn(200);
        when(mockOrderResponseResult.getData()).thenReturn(mockOrder);
        when(xpOrderClient.queryOrderById(anyLong())).thenReturn(mockOrderResponseResult);
        mockXpVehicle = new XpVehicle();
        mockXpVehicle.setXpuId("xpu-001");
        mockXpVehicle.setVehicleVin("test-vin");
        when(mockResponseResult.getData()).thenReturn(mockXpVehicle);
        when(xpVehicleClient.queryById(anyLong())).thenReturn(mockResponseResult);
        // mock mongoTemplate.findOne 返回 VehiclePosition,避免 "车辆位置信息不存在" 异常
        VehiclePosition mockVehiclePosition = new VehiclePosition();
        mockVehiclePosition.setVin("test-vin");
        mockVehiclePosition.setPoint(new GeoJsonPoint(113.3245, 23.1235));
        when(mongoTemplate.findOne(any(Query.class), eq(VehiclePosition.class))).thenReturn(mockVehiclePosition);
        RouteVo mockRouteVo = new RouteVo();
        mockRouteVo.setRouteID("test-route-id");
        when(xpMapClient.getOrderDistanceAndDuration(any())).thenReturn(R.ok(mockRouteVo));
        when(xpMapClient.queryRouted(any())).thenReturn(R.ok("test-routed-data"));
        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
        // 执行测试
        kafkaTestController.topicProdRobotaxiXpuHigh(testMessage);
    }
    @Test
    @DisplayName("测试XPU发送订单状态请求")
    public void testXPUSendOrderStatusRequest() throws IOException {
        // 从本地文件读取测试数据
        String testMessage = readJsonFile("src/test/resources/jsondemo/cloud/order_status_info_event.json");
        // 执行测试
        kafkaTestController.topicProdRobotaxiXpuHigh(testMessage);
    }
    //当前没有处理
    @Test
    @DisplayName("测试XPU发送导航信息更新")
    public void testXPUSendNavigationInfoUpdate() throws IOException {
        // 从本地文件读取测试数据
        String testMessage = readJsonFile("src/test/resources/jsondemo/cloud/navigation_info_update_event.json");
        // 执行测试
        kafkaTestController.topicProdRobotaxiXpuHigh(testMessage);
    }
    @Test
    @DisplayName("测试XPU发送偏航信息")
    public void testXPUSendNavigationDeviationEvent() throws IOException {
        // 从本地文件读取测试数据
        String testMessage = readJsonFile("src/test/resources/jsondemo/cloud/navi_deviation_event.json");
        XpOrder mockOrder = new XpOrder();
        mockOrder.setId(1881347710714060802L);
        mockOrder.setStatus(3);
        mockOrder.setVehicleId(1L);
        when(mockOrderResponseResult.getCode()).thenReturn(200);
        when(mockOrderResponseResult.getData()).thenReturn(mockOrder);
        when(xpOrderClient.queryOrderById(anyLong())).thenReturn(mockOrderResponseResult);
        mockXpVehicle = new XpVehicle();
        mockXpVehicle.setXpuId("xpu-001");
        mockXpVehicle.setVehicleVin("test-vin");
        when(mockResponseResult.getData()).thenReturn(mockXpVehicle);
        when(xpVehicleClient.queryById(anyLong())).thenReturn(mockResponseResult);
        RouteVo mockRouteVo = new RouteVo();
        mockRouteVo.setRouteID("test-route-id");
        when(xpMapClient.getOrderDistanceAndDuration(any())).thenReturn(R.ok(mockRouteVo));
        when(xpMapClient.queryRouted(any())).thenReturn(R.ok("test-routed-data"));
        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
        // 执行测试
        kafkaTestController.topicProdRobotaxiXpuHigh(testMessage);
    }
}
xp-robotaxi-vehicle-convoy-boot/src/main/resources/application-local.yml
@@ -1,6 +1,18 @@
spring:
  autoconfigure:
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
  redis:
    database: 99
    host: r-bp1ip8die60uuo3ovypd.redis.rds.aliyuncs.com
    password: syAktm2x9uDusoF_
    port: 6379
  data:
    mongodb:
      host: dds-bp1f4a38f3cccad4-pub.mongodb.rds.aliyuncs.com
      port: 3717
      database: xp_robotaxi
      username: xp_robotaxi
      password: hDXSBe_hs0d5KxUf
  shardingsphere:
    props:
      sql.show: true
xp-robotaxi-vehicle-convoy-boot/src/main/resources/bootstrap.yml
@@ -1,7 +1,7 @@
server:
  port: 6100
  tomcat:
    basedir: /data/tomcat
    basedir: data/tomcat
# Spring
spring:
  application: