gpt4 book ai didi

c++ - GoogleMock:如何保存要在下次调用模拟时使用的参数

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:51 26 4
gpt4 key购买 nike

我尝试模拟表示 NVRAM 的现有类的行为和 API。 API 是:

bool Init(Uint8* dataPointer); 
bool Store(); //Writes the data from dataPointer into the NVRAM
bool Restore(); //Writes the data from NVRAM into the dataPointer

我的测试场景如下:

  1. 创建ClassUnderTest,同时调用Init方法

  2. 在我的 ClassUnderTest 中调用另一个方法,它调用 Restore 方法。我希望能够以某种方式控制我的模拟,即在调用 Restore 方法后设置 dataPointer 的值。

或者用伪代码:

MockFoo foo;
EXPECT_CALL(foo, Init(dataPointer)).WillOnce(Return(true));
EXPECT_CALL(foo, Restore()).WillOnce(DoAll(memcpy(dataPointer, testValues, sizeOf(testValues)), Return(true)));

到目前为止我尝试了什么:

  • googleMock 的默认操作(例如 SaveArg):允许我将数据写入 dataPointer,但仅限于 Init 调用。
  • 编写一个 ACTION_TEMPLATE 将 dataPointer 保存在局部变量中,然后在调用 Restore 时更改其值:据我所知,我只能将 VALUE_PARAMS 添加到ACTION_TEMPLATE,因此我可以将值传递给模板,但无法通过某个指针再次传递它们。
  • 我查看了 ActionInterface 和 Polymorphic Actions,如果我正确理解了文档,关于我的问题,它们与 ACTION_TEMPLATE 有相同的限制。

最后我的主要问题是:有没有办法在 Init 调用期间保存 dataPointer 以备后用?

最佳答案

就我个人而言,我几乎从不使用此 SaveArgACTION 或其他小的 gmock 功能。我更喜欢使用 Invoke 并只定义我自己的逻辑,每当执行对模拟方法的调用时都应调用该逻辑。它可能看起来有点矫枉过正,但实际上通常更易读且更短:

class API {
public:
virtual bool Init(uint8_t* dataPointer) = 0;
virtual bool Store() = 0;
virtual bool Restore() = 0;
};

class MockAPI : public API {
public:
MOCK_METHOD1(Init,
bool(uint8_t* dataPointer));
MOCK_METHOD0(Store,
bool());
MOCK_METHOD0(Restore,
bool());
};

class ClassUnderTest {
public:
explicit ClassUnderTest(std::shared_ptr<API> api): api_(api) {
dataPtr_ = new uint8_t;
api_->Init(dataPtr_);
}
~ClassUnderTest() {
delete dataPtr_;
}
bool anotherMethod() {
api_->Restore();
return true;
}
uint8_t takeALookAtTheData() {
return *dataPtr_;
}
private:
std::shared_ptr<API> api_;
uint8_t* dataPtr_;
};

using testing::_;
using testing::Invoke;

TEST(xxx, yyy) {
auto mockApi = std::make_shared<MockAPI>();
uint8_t* dataPtr(nullptr);
uint8_t testValue = 123;
ON_CALL(*mockApi, Init(_)).WillByDefault(Invoke([&dataPtr](uint8_t* dataPointer) {
dataPtr = dataPointer;
return true;
}));
ON_CALL(*mockApi, Restore()).WillByDefault(Invoke([&dataPtr, testValue]() {
*dataPtr = testValue;
return true;
}));
ClassUnderTest sut(mockApi);
ASSERT_NE(nullptr, dataPtr);
sut.anotherMethod();
ASSERT_EQ(testValue, *dataPtr);
ASSERT_EQ(testValue, sut.takeALookAtTheData());
}

我希望我的假设是正确的,您的系统应该分配所需的内存并且您的 API 负责操作它。无论如何,这应该可以解决您的问题。

关于c++ - GoogleMock:如何保存要在下次调用模拟时使用的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56543634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com