海南找人做网站,海口手机版网站建设,织梦登录wordpress,网站快排是怎么做的文章目录 gmock vs mockcpp1 基本介绍2 语法风格与使用方式gmock 特点#xff08;基于接口 Mock#xff09;#xff1a;mockcpp 特点#xff08;基于重写/拦截原函数#xff09;#xff1a; 3 对比总结4 实际使用建议 gmock vs mockcpp
gmock 和 mockcpp 是 C 中常用的两… 文章目录 gmock vs mockcpp1 基本介绍2 语法风格与使用方式gmock 特点基于接口 Mockmockcpp 特点基于重写/拦截原函数 3 对比总结4 实际使用建议 gmock vs mockcpp
gmock 和 mockcpp 是 C 中常用的两个 Mock 框架用于单元测试时模拟对象或函数的行为。
它们的核心目标相似使测试更加隔离、可控与可验证但两者在设计理念、使用方式、语法风格、兼容性等方面存在明显差异。 1 基本介绍
项目gmockGoogle Mockmockcpp作者Google东南大学何海涛等语言C与 gtest 紧密集成C发布时间2008 年左右2006 年左右依赖Google Test (gtest)无需 gtest可与其它测试框架搭配 2 语法风格与使用方式
gmock 特点基于接口 Mock
基于接口/抽象类设计需要提前设计好虚函数接口使用宏定义 MOCK_METHOD() 快速生成 Mock 函数测试语句直观如EXPECT_CALL(mockObj, Foo()).Times(1);支持匹配器_, Eq(x), AnyOf, AllOf 等语法现代、类型安全支持 C11
class ICalc {
public:virtual int Add(int a, int b) 0;virtual ~ICalc() default;
};class MockCalc : public ICalc {
public:MOCK_METHOD(int, Add, (int a, int b), (override));
};TEST(MyTest, Addition) {MockCalc calc;EXPECT_CALL(calc, Add(1, 2)).WillOnce(Return(3));ASSERT_EQ(calc.Add(1, 2), 3);
}mockcpp 特点基于重写/拦截原函数
不依赖接口或虚函数可以对 非虚函数/全局函数/静态函数 进行 Mock使用 MOCKER(methodName).stubs().will(returnValue()); 风格内部使用函数地址重写、hook 技术等实现原函数替换支持打桩Stub与调用验证适合 legacy code老代码测试不易侵入原设计
class Calc {
public:int Add(int a, int b) { return a b; }
};TEST_F(MyTest, AddMock) {MOCK_METHOD(Calc, Add).stubs().will(returnValue(42));Calc calc;ASSERT_EQ(calc.Add(1, 2), 42);
}3 对比总结
特性gmockmockcppMock 方式基于虚函数接口函数地址拦截可 Mock 普通函数对老代码支持差需重构为虚接口强无需修改原代码语法风格现代强类型安全表达式链式调用类似脚本语言的 DSL易用但类型不安全调用验证支持 EXPECT_CALL支持 .expects().with(...)可测试对象虚函数、成员函数所有函数包括静态函数、全局函数依赖关系依赖 gtest独立兼容多种测试框架编译兼容性高度依赖编译器特性现代 GCC/Clang 更好支持低层 hook有些编译器和系统下不稳定适合应用新代码、接口良好的模块老代码、未封装接口的遗留项目 4 实际使用建议
如果你在做现代 C 项目C11并使用 gtest 作为测试框架推荐使用 gmock配合 gtest 效果更佳如果你在维护遗留项目、无法改写为虚函数接口或者需要对 静态函数、全局函数、第三方库函数进行打桩推荐使用 mockcpp也可以在一个项目中同时使用 gmock 和 mockcpp根据不同的模块情况选择合适的 Mock 方式。