如何让NiceMock<>的抑制警告效果仅作用于gmock模拟类的单个方法?
问题解答
结论
可以单独抑制指定模拟方法的未预期调用警告,无需使用NiceMock<>全局关闭所有警告。
实现方法
针对你给出的PocoMock示例,有两种常用实现方案:
方案1:单测试用例单独设置
在对应测试用例的初始化阶段,为getAddress设置宽松调用规则即可:
#include <gmock/gmock.h> TEST(PocoTest, DemoTest) { PocoMock mock; // 仅抑制getAddress的未预期调用警告 EXPECT_CALL(mock, getAddress(::testing::_)) .Times(::testing::AnyNumber()); // 后续测试逻辑... }
规则说明:
::testing::_匹配任意输入参数Times(::testing::AnyNumber())表示允许该方法被调用0次或任意多次,既不会因为方法未被调用报错,也不会因为意料之外的调用触发警告- 其余
listen、start、stop方法未设置该规则,未预期调用时仍会正常输出警告
方案2:全局复用规则(所有使用PocoMock的测试自动生效)
如果希望所有用到PocoMock的测试用例都默认抑制getAddress的警告,不需要每个用例重复写规则,可以直接把配置写到模拟类的构造函数中:
class PocoMock : public Poco { public: PocoMock() // : Poco() { // 所有PocoMock实例默认抑制getAddress的未预期调用警告 EXPECT_CALL(*this, getAddress(::testing::_)) .Times(::testing::AnyNumber()); // 如果需要自定义默认返回值,可以搭配ON_CALL使用,示例: // ON_CALL(*this, getAddress(::testing::_)) // .WillByDefault(::testing::Return("127.0.0.1")); } MOCK_CONST_METHOD1(listen, void(Poco::Net::ServerSocket& rSocket)); MOCK_CONST_METHOD1(start, void(Poco::Net::TCPServer& rServer)); MOCK_CONST_METHOD1(stop, void(Poco::Net::TCPServer& rServer)); MOCK_CONST_METHOD1( getAddress, std::string(const Poco::Net::StreamSocket& rSocket)); };
内容的提问来源于stack exchange,提问作者Fadeway
相关产品推荐
相关产品推荐

