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 mockResponseResult; @Mock private R 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); } }