如何用GoogleMock实现带变量条件的函数调用预期校验?
GoogleMock实现“变量a等于42时调用foo::bar”的断言需求
需求:确保仅当变量a的值为42时,foo类的bar()方法才被调用。
测试失败的被测代码
int a = 41; foo.bar();
测试通过的被测代码
int a = 41; a++; foo.bar();
实现方案
首先需要定义foo类的Mock类(若未定义):
class MockFoo : public foo { public: MOCK_METHOD(void, bar, (), (override)); };
方式一:通过Invoke在调用时检查变量值
利用Invoke传入Lambda表达式,在bar()被调用时捕获并校验a的值:
MockFoo mock; EXPECT_CALL(mock, bar()) .WillOnce(Invoke([&a]() { ASSERT_EQ(a, 42); // 调用bar()时检查a是否为42,不满足则测试失败 }));
如果需要支持多次调用,将WillOnce替换为WillRepeatedly即可。
方式二:结合自定义断言逻辑
如果需要更清晰的失败提示,可以封装自定义断言函数:
testing::AssertionResult IsAEqualTo42(int a) { if (a == 42) { return testing::AssertionSuccess(); } return testing::AssertionFailure() << "a的值是" << a << ",不符合预期的42"; } // 测试中使用 MockFoo mock; EXPECT_CALL(mock, bar()) .WillOnce(Invoke([&a]() { EXPECT_TRUE(IsAEqualTo42(a)); }));
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

