注入std::string与StrictMock<MockClass>映射至被测类的构造匹配问题
问题分析与解决方案
问题根源
你遇到的构造函数不匹配问题,核心是容器类型不兼容:
ButtonRouter的构造函数需要的是std::map<std::string, WorkerInterface*>,但你传入的是std::map<std::string, StrictMock<MOCK_WorkerInterface>*>。虽然StrictMock<MOCK_WorkerInterface>*可以隐式转换为WorkerInterface*,但容器本身是不同的模板实例,无法直接隐式转换。
修正方法
把映射的类型直接声明为构造函数要求的std::map<std::string, WorkerInterface*>,然后将StrictMock实例的指针存入即可——因为StrictMock<MOCK_WorkerInterface>是WorkerInterface的子类,子类指针可以安全向上转型为父类指针:
// 修正映射类型为构造函数要求的父类指针容器 std::map<std::string, WorkerInterface*> my_map; StrictMock<MOCK_WorkerInterface>* worker_1 = new StrictMock<MOCK_WorkerInterface>(); StrictMock<MOCK_WorkerInterface>* worker_2 = new StrictMock<MOCK_WorkerInterface>(); StrictMock<MOCK_WorkerInterface>* worker_3 = new StrictMock<MOCK_WorkerInterface>(); my_map.insert(std::make_pair("worker_1", worker_1)); my_map.insert(std::make_pair("worker_2", worker_2)); my_map.insert(std::make_pair("worker_3", worker_3)); // 此时构造函数可以正常匹配 ButtonRouter* button_router = new ButtonRouter(my_map);
关于注入方式的建议
你当前通过映射注入多个Worker实例的方式是合理的,完全符合ButtonRouter的设计逻辑(根据按钮路由到对应Worker),不需要改为直接注入单个实例。只要修正容器类型,就能正常完成Mock注入并开展单元测试。
内容的提问来源于stack exchange,提问作者Zuiax
相关产品推荐
相关产品推荐

