#include #include #include "collector/DataCollector.h" #include "utils/Logger.h" // 创建一个 Mock DataSource 类 class MockDataSource : public DataSource { public: MOCK_METHOD(bool, connect, (), (override)); MOCK_METHOD(void, disconnect, (), (override)); MOCK_METHOD(bool, isAvailable, (), (const, override)); MOCK_METHOD(bool, fetchAircraftData, (std::vector&), (override)); MOCK_METHOD(bool, fetchVehicleData, (std::vector&), (override)); }; class DataCollectorTest : public ::testing::Test { protected: void SetUp() override { collector = std::make_unique(); mockSource = std::make_shared<::testing::NiceMock>(); collector->setDataSource(mockSource); } void TearDown() override { collector.reset(); } // 创建测试数据 Aircraft createTestAircraft(const std::string& id, double lat, double lon) { Aircraft a; a.id = id; a.flightNo = id; a.trackNumber = "TN" + id; a.geo.latitude = lat; a.geo.longitude = lon; a.altitude = 5.0; a.timestamp = std::chrono::system_clock::now().time_since_epoch().count(); return a; } Vehicle createTestVehicle(const std::string& id, double lat, double lon) { Vehicle v; v.id = id; v.vehicleNo = id; v.geo.latitude = lat; v.geo.longitude = lon; v.timestamp = std::chrono::system_clock::now().time_since_epoch().count(); return v; } std::unique_ptr collector; std::shared_ptr mockSource; }; // 测试初始化 TEST_F(DataCollectorTest, Initialization) { DataSourceConfig dataSourceConfig; dataSourceConfig.host = "localhost"; dataSourceConfig.port = 8080; dataSourceConfig.aircraft_path = "/api/getCurrentFlightPositions"; WarnConfig warnConfig; warnConfig.warning_interval_ms = 1000; warnConfig.log_interval_ms = 2000; EXPECT_TRUE(collector->initialize(dataSourceConfig, warnConfig)); } // 测试刷新方法 TEST_F(DataCollectorTest, RefreshTest) { std::vector testAircraft = { createTestAircraft("TEST1", 36.36, 120.08), createTestAircraft("TEST2", 36.37, 120.09) }; std::vector testVehicles = { createTestVehicle("VEH1", 36.36, 120.08), createTestVehicle("VEH2", 36.37, 120.09) }; // 设置 Mock 数据返回 EXPECT_CALL(*mockSource, fetchAircraftData) .WillOnce(::testing::DoAll( ::testing::SetArgReferee<0>(testAircraft), ::testing::Return(true) )); EXPECT_CALL(*mockSource, fetchVehicleData) .WillOnce(::testing::DoAll( ::testing::SetArgReferee<0>(testVehicles), ::testing::Return(true) )); // 执行刷新 collector->refresh(); // 验证数据 auto aircraft = collector->getAircraftData(); EXPECT_EQ(aircraft.size(), 2); if (!aircraft.empty()) { EXPECT_EQ(aircraft[0].flightNo, "TEST1"); EXPECT_EQ(aircraft[1].flightNo, "TEST2"); } auto vehicles = collector->getVehicleData(); EXPECT_EQ(vehicles.size(), 2); if (!vehicles.empty()) { EXPECT_EQ(vehicles[0].vehicleNo, "VEH1"); EXPECT_EQ(vehicles[1].vehicleNo, "VEH2"); } } // 测试数据采集循环 TEST_F(DataCollectorTest, DataCollectionLoop) { std::vector testAircraft = { createTestAircraft("TEST1", 36.36, 120.08) }; std::vector testVehicles = { createTestVehicle("VEH1", 36.36, 120.08) }; // 设置 Mock 数据返回 EXPECT_CALL(*mockSource, fetchAircraftData) .WillRepeatedly(::testing::DoAll( ::testing::SetArgReferee<0>(testAircraft), ::testing::Return(true) )); EXPECT_CALL(*mockSource, fetchVehicleData) .WillRepeatedly(::testing::DoAll( ::testing::SetArgReferee<0>(testVehicles), ::testing::Return(true) )); // 启动采集 collector->start(); // 等待数据采集 std::this_thread::sleep_for(std::chrono::seconds(2)); // 停止采集 collector->stop(); // 验证数据 auto aircraft = collector->getAircraftData(); EXPECT_EQ(aircraft.size(), 1); auto vehicles = collector->getVehicleData(); EXPECT_EQ(vehicles.size(), 1); } // 测试错误处理 TEST_F(DataCollectorTest, ErrorHandling) { // 设置 Mock 返回错误 EXPECT_CALL(*mockSource, fetchAircraftData) .WillOnce(::testing::Return(false)); EXPECT_CALL(*mockSource, fetchVehicleData) .WillOnce(::testing::Return(false)); // 执行刷新 collector->refresh(); // 验证数据为空 auto aircraft = collector->getAircraftData(); EXPECT_TRUE(aircraft.empty()); auto vehicles = collector->getVehicleData(); EXPECT_TRUE(vehicles.empty()); }