如何为trompeloeil中Mock对象数组设置统一预期?
批量设置GMock对象数组的预期及覆盖方法
批量设置默认预期
可以通过编写模板辅助函数来批量为数组内的所有Mock对象设置统一预期,避免重复编写ALLOW_CALL。
示例辅助函数:
template <typename MockType, size_t N> void setup_default_wheel_behavior(MockType (&wheels)[N]) { for (auto& wheel : wheels) { ALLOW_CALL(wheel, is_flat()).RETURN(true); } }
覆盖部分对象的预期
GMock中针对同一个Mock对象,后设置的预期会覆盖先设置的预期(同一作用域内有效)。因此可以先批量设置默认行为,再单独为需要特殊处理的对象编写预期。
完整测试用例示例:
struct MockWheel : public IWheel { MAKE_MOCK0(is_flat, bool(), override); }; TEST_CASE("test_wheels") { MockWheel w[4]; { // 批量设置所有轮子默认返回true setup_default_wheel_behavior(w); // 单独覆盖索引为2的轮子,使其返回false ALLOW_CALL(w[2], is_flat()).RETURN(false); REQUIRE(all_tyres_ok(w) == false); } }
扩展灵活批量处理
如果需要针对特定索引范围或条件的对象设置预期,可以扩展辅助函数,比如只对指定索引的对象设置行为:
#include <vector> template <typename MockType, size_t N> void setup_wheel_behavior_for_indices(MockType (&wheels)[N], const std::vector<size_t>& indices, bool return_val) { for (size_t idx : indices) { if (idx < N) { // 防止数组越界 ALLOW_CALL(wheels[idx], is_flat()).RETURN(return_val); } } }
使用方式:
setup_default_wheel_behavior(w); // 同时覆盖索引1和2的对象 setup_wheel_behavior_for_indices(w, {1, 2}, false);
内容的提问来源于stack exchange,提问作者Grim Fandango
相关产品推荐
相关产品推荐

