You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

注入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:24:55