如何为Google Mock的EXPECT_CALL中不同WillOnce的Lambda传预期参数?
在Google Mock中为多次调用的Mock函数传递不同验证参数
针对你遇到的问题——需要在Mock函数的多次调用中,给验证Lambda传递不同的预期结果,这里有几种简洁的实现方式:
方法1:Lambda捕获绑定预期值
把通用验证逻辑抽离成可复用的函数,然后在每个WillOnce中创建捕获对应预期值的Lambda,直接调用验证逻辑。这种方式直观易懂,适合少量调用的场景。
修改后的测试代码:
TEST(mytest, test1) { DependencyMock depMock; Service service{&depMock}; // 通用验证逻辑:接收实际参数和预期结果 auto verifyFoo = [](double d, double expectedResult) { auto result = d + 123; // 你的复杂验证逻辑 EXPECT_EQ(result, expectedResult); }; EXPECT_CALL(depMock, foo(_)) .Times(2) // 第一次调用:预期结果为1.2 + 123 = 124.2 .WillOnce(Invoke([&verifyFoo](double d) { verifyFoo(d, 124.2); })) // 第二次调用:预期结果为2.3 + 123 = 125.3 .WillOnce(Invoke([&verifyFoo](double d) { verifyFoo(d, 125.3); })); service.doStuff(); }
方法2:使用std::bind绑定额外参数
如果不想嵌套Lambda,可以用std::bind把预期值绑定到验证函数的参数上,直接传递给Invoke。这种方式更适合复用已有的验证函数。
修改后的测试代码:
TEST(mytest, test1) { DependencyMock depMock; Service service{&depMock}; // 通用验证函数:注意参数顺序,Mock的参数在前,额外参数在后 auto verifyFoo = [](double d, double expectedResult) { auto result = d + 123; // 你的复杂验证逻辑 EXPECT_EQ(result, expectedResult); }; EXPECT_CALL(depMock, foo(_)) .Times(2) // 绑定预期值124.2作为验证函数的第二个参数 .WillOnce(Invoke(std::bind(verifyFoo, std::placeholders::_1, 124.2))) // 绑定预期值125.3作为验证函数的第二个参数 .WillOnce(Invoke(std::bind(verifyFoo, std::placeholders::_1, 125.3))); service.doStuff(); }
方法3:队列存储预期值(适合多次调用场景)
如果Mock函数会被调用很多次,可以用队列存储所有预期结果,每次验证时取出一个。这种方式避免重复编写多个WillOnce,代码更简洁。
修改后的测试代码:
TEST(mytest, test1) { DependencyMock depMock; Service service{&depMock}; // 预存所有预期结果,顺序要和Mock函数调用顺序一致 std::queue<double> expectedResults; expectedResults.push(124.2); expectedResults.push(125.3); auto verifyFoo = [&expectedResults](double d) { auto result = d + 123; // 你的复杂验证逻辑 EXPECT_EQ(result, expectedResults.front()); expectedResults.pop(); }; EXPECT_CALL(depMock, foo(_)) .Times(2) .WillRepeatedly(Invoke(verifyFoo)); service.doStuff(); }
内容的提问来源于stack exchange,提问作者jviita
相关产品推荐
相关产品推荐

