vs2010使用gmock

#include <iostream>
#include <string>
#include <vector>
#include <gtest/gtest.h>
#include <gmock/gmock.h>
using namespace std;
//连接gmock.lib
#pragma comment(lib,"gmock.lib")

//定义UserInterface类,值提供接口,没有具体实现
class UserInterface 
{
public:
	virtual ~UserInterface() {}
public:
	virtual std::string getArbitraryString() = 0;
	virtual int getAdd(int a,int b) = 0;
	virtual void addString( std::vector<string> v ) = 0;
};

//MockUser类,继承UserInterface	
class MockUser: public UserInterface 
{
public:
	//MOCK_METHOD0代表没有参数,MOCK_METHOD1代表有一个参数,MOCK_METHOD2代表有两个参数
	//MOCK_METHOD0~10	MOCK_METHOD最多支持10个形参
	/*MOCK_METHOD0函数原型如下: tn,constness,ct参数为空,Method为方法名,F为函数结构
		GMOCK_METHOD0_(tn, constness, ct, Method, F) \
		GMOCK_RESULT_(tn, F) ct Method() constness { \
		GTEST_COMPILE_ASSERT_(::std::tr1::tuple_size< \
		tn ::testing::internal::Function<F>::ArgumentTuple>::value == 0, \
		this_method_does_not_take_0_arguments); \
		GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method); \
		return GMOCK_MOCKER_(0, constness, Method).Invoke(); \
	} */
	MOCK_METHOD0(getArbitraryString, std::string());
	MOCK_METHOD2(getAdd, int(int x,int y) );
	MOCK_METHOD1(addString , void( std::vector<string> v));
};

using ::testing::Return;

int main(int argc, char** argv) 
{
	//初始化
	::testing::InitGoogleMock(&argc, argv);
	string value = "This is Mock!";
	//创造对象
	MockUser mockFoo;

	//定义一个期望行为,其中Times(1)的意思是运行一次,
	//WillOnce(Return(value))的意思是第一次运行时把
	//value作为getArbitraryString()方法的返回值。
	EXPECT_CALL(mockFoo, getArbitraryString()).Times(1).
		WillOnce(Return(value));

	//::testing::Eq(1)表示输入参数等于1, ::testing::Gt(0)表示输入参数大于0
	//如果不符合,则会报错
	//::testing::AtLeast(1)表示至少运行1次
	EXPECT_CALL(mockFoo, getAdd(::testing::Eq(1), ::testing::Gt(0)))
		.Times(::testing::AtLeast(1)).WillOnce(Return(200));

	vector<string> v;
	EXPECT_CALL(mockFoo, addString(v)).Times(1);

	string returnValue = mockFoo.getArbitraryString();
	cout << "Returned Value: " << returnValue << endl;
	cout << "Returned Value: " << mockFoo.getAdd(1,2)<< endl;

	getchar();
	return EXIT_SUCCESS;
}

### Visual Studio 中使用 gmock 进行单元测试 #### 配置环境 为了在 Windows 上利用 Visual Studio 2022 和 vcpkg 来设置 gmock 测试框架,需先完成必要的软件包安装。这涉及下载并初始化 vcpkg 工具链,随后通过该工具获取最新版本的 gtest 及其扩展库 gmock[^2]。 #### 创建项目结构 创建一个新的 C++ 控制台应用程序作为承载待测代码的基础工程。接着,在同一解决方案下新增一个专门用于存放测试逻辑的静态链接库或动态链接库项目。此布局有助于分离生产代码同验证程序之间的依赖关系[^4]。 #### 编写 Mock 类定义 借助于 `gmock` 提供的功能可以轻松模拟接口行为。例如: ```cpp #include <gmock/gmock.h> class IMathOperation { public: virtual ~IMathOperation() = default; virtual int Add(int a, int b) const = 0; }; class MockMathOperation : public IMathOperation { public: MOCK_METHOD((int), Add, ((int, int)), (const)); }; ``` 上述代码片段展示了如何声明抽象基类以及相应的 mock 实现形式[^1]。 #### 组织测试套件 采用 Google Test 的宏指令构建具体的检验场景。下面的例子说明了怎样针对先前定义的操作执行简单的相加运算检查: ```cpp TEST(MathOperationsTestSuite, VerifyAdditionWorksCorrectlyWithMockObject) { MockMathOperation mathOp; EXPECT_CALL(mathOp, Add(1, 2)) .Times(Exactly(1)) .WillOnce(Return(3)); ASSERT_EQ(3, mathOp.Add(1, 2)); } ``` 这段脚本不仅指定了预期调用次数还设定了返回值模式,从而确保被模仿对象按预想方式响应输入参数[^3]。 #### 启动全部测试集 最后一步是在全局入口函数处注册所有已编写的测试实例,并触发它们的实际运行过程: ```cpp int wmain(int argc, wchar_t* argv[]) { ::testing::InitGoogleMock(&argc, argv); return RUN_ALL_TESTS(); } ``` 以上即为完整的基于 VS 平台上运用 gmock 开展单元测试的方法论介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值