gpt4 book ai didi

c++ - 无趣的模拟函数调用 bla() && 预期 : to be called at least once bla()?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:24 25 4
gpt4 key购买 nike

我用模拟类编写了一个小测试。当我运行它时,首先我得到一个警告,说调用了一个无趣的模拟函数,然后测试失败,因为没有满足预期,即至少调用了一次模拟函数。有趣的是,当我看到上面的警告消息时,该函数被调用了。

你对这件事有什么想法吗?

谢谢!

编辑:这是我的代码结构:

class Bla {

public:
Bla();
virtual ~Bla();

virtual float myFunction();
}

class MockBla : public Bla {
MockBla();
~MockBla();
MOCKMETHOD0(myFunction, float());
}

class CallerClass {

public:
CallerClass() { MockBla* myMock = new MockBla(); }
virtual ~CallerClass();

myCallingFunction() { myMock->myFunction(); }
}

class MyTestClass : public ::testing::Test {
//....
TEST(myTest, testMyFunction) {
MockBla mockBla;
EXPECT_CALL(mockBla, myFunction()).Times(AtLeast(1));

CallerClass* callerClass;
callerClass = new CallerClass();

callerClass->myCallingFunction();

}
//....
}

结果:

[ RUN      ] MyTestClass.testMyFunction

GMOCK WARNING:
Uninteresting mock function call - returning default value.
Function call: myFunction()
Returns: 0
Stack trace:
MyTestClass.cpp:99: Failure
Actual function call count doesn't match EXPECT_CALL(mockBla, myFunction())...
Expected: to be called at least once
Actual: never called - unsatisfied and active

最佳答案

您需要对将在测试执行期间调用的模拟类的实际实例设置期望值。

在您的情况下,您正在对对象 mockBla 设置期望值,该对象仅在测试结束时构造然后销毁 - 它从未使用过。

您需要将模拟对象传递给 CallerClass 以使用,或者允许 CallerClass 创建模拟对象作为成员变量,但随后允许测试对该实际成员的访问(例如通过 getter 或允许测试成为 CallerClass 的友元)。

将模拟对象传递给调用类的示例如下:

#include <memory>
#include "gmock/gmock.h"

class Bla {
public:
virtual ~Bla() {}
virtual float myFunction() = 0;
};

class MockBla : public Bla {
public:
MOCK_METHOD0(myFunction, float());
};

class CallerClass {
public:
explicit CallerClass(Bla* bla) : mBla(bla) {}
void myCallingFunction() { mBla->myFunction(); }
private:
Bla* mBla;
};

TEST(myTest, testMyFunction) {
std::shared_ptr<Bla> mockBla(new MockBla);
EXPECT_CALL(*std::static_pointer_cast<MockBla>(mockBla),
myFunction()).Times(testing::AtLeast(1));

CallerClass callerClass(mockBla.get());
callerClass.myCallingFunction();
}

int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

关于c++ - 无趣的模拟函数调用 bla() && 预期 : to be called at least once bla()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17060980/

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