【发布时间】:2022-07-26 05:42:23
【问题描述】:
在 MFC 中使用 c++11,并尝试使用 gtest 1.7 创建一些单元测试,我遇到了一个问题。我想在不更改下面方法的声明或定义的情况下模拟一个讨厌的方法。
virtual bool getValue(CStringArray& valueOut) const;
Mocking 很简单,MOCK_CONST_METHOD1(getValue,bool(CStringArray&)); 会为我做这件事。但是,在测试用例中使用,我无法使其工作。
测试用例的相关部分:
CStringArray localArray;
localArray.Add("Only One Element");
EXPECT_CALL(object, getValue(_)).WillOnce(DoAll(SetArgReferee<0>(localArray), Return(true)));
这给了我一个编译错误,因为CStringArray(派生自CObject)是不可复制、不可移动的对象。我的问题是,
如何仅使用模拟函数来更改返回数组?
我知道我可以创建一个混合模拟,用一个真正的函数来构建数组,但是我很难为每个测试用例添加自定义元素。比如:
struct MockNastyObject : public NastyObject {
MOCK_CONST_METHOD1(getValueMock, bool(CStringArray&));
virtual bool getValue(CStringArray& arr) const override{
arr.Add("Element1");
getValueMock(arr);
}
};
这种方法可行,因为我可以为 getValueMock 设置期望值并使用非模拟方法更改数组。
【问题讨论】:
-
使用 MFC 进行单元测试?!没看过。你想达到什么目标?
-
我有这个
getValue函数,它使用数据库——我在测试中不能也不想。它返回我提供的参数中的值,在本例中为CStringArray。哦,如果成功则返回true。所以,我想在每个测试中用不同的假值填充该数组。
标签: c++ mfc googletest googlemock