在 ON_CALL 语句后面加上 EXPECT_CALL 语句时,有没有人见过 gmock 中的奇怪行为?对我来说,以下代码中的 EXPECT_CALL 语句不起作用(它实际上并不强制执行 Times 部分):
ON_CALL(myMockObject, myMockMethod()).WillByDefault(Return("hello mock")));
EXPECT_CALL(myMockObject, myMockMethod()).Times(99999);
myMockObject.myMockMethod();
我尝试过的其他解决方案:
重写父类(super class)中的 myMockMethod 并让它仅返回字符串文字。问题是我无法确定它后来被调用了多少次。
跳过 ON_CALL 部分,转而采用如下方式:
EXPECT_CALL(myMockObject, myMockMethod())
.Times(1)
.WillRepeatedly(Return("hello mock"));
这会导致编译错误。
还值得注意的是,我在本示例中使用的字符串文字实际上是自定义的,gmock 无法提供默认值(例如 bool)。
最佳答案
您的原始代码中有一些其他错误,您的问题中没有提到这些错误。如果您构建一个最小的独立示例,问题中提供的代码的行为将符合您的预期。
例如以下代码:
#include <string>
#include "gmock/gmock.h"
using ::testing::Return;
struct MyClass {
virtual ~MyClass() {}
virtual std::string myMockMethod() = 0;
};
struct MyMockClass : MyClass {
MOCK_METHOD0(myMockMethod, std::string());
};
TEST(MyClass, Fails) {
MyMockClass myMockObject;
ON_CALL(myMockObject, myMockMethod()).WillByDefault(Return("hello mock"));
EXPECT_CALL(myMockObject, myMockMethod()).Times(99999);
myMockObject.myMockMethod();
}
TEST(MyClass, Passes) {
MyMockClass myMockObject;
EXPECT_CALL(myMockObject, myMockMethod()).Times(1).WillRepeatedly(Return("hello mock"));
myMockObject.myMockMethod();
}
int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
产生以下(预期)输出:
[==========] Running 2 tests from 1 test case. [----------] Global test environment set-up. [==========] 2 tests from MyClass [ RUN ] MyClass.Fails ..\src\main.cc(18): error: Actual function call count doesn't match EXPECT_CALL(myMockObject, myMockMethod())... Expected: to be called 99999 times Actual: called once - unsatisfied and active [ FAILED ] MyClass.Fails (0 ms) [ RUN ] MyClass.Passes [ OK ] MyClass.Passes (0 ms) [----------] 2 tests from MyClass (2 ms total) [----------] Global test environment tear-down [==========] 2 tests from 1 test case ran. (2 ms total) [ PASSED ] 1 test. [ FAILED ] 1 test, listed below: [ FAILED ] MyClass.Fails 1 FAILED TEST
如果您希望模拟对象保存在测试装置中,您可以这样做:
class MyClassTest : public testing::Test {
protected:
MyMockClass myMockObject_;
};
TEST_F(MyClassTest, Fails) {
ON_CALL(myMockObject_, myMockMethod()).WillByDefault(Return("hello mock"));
EXPECT_CALL(myMockObject_, myMockMethod()).Times(99999);
myMockObject_.myMockMethod();
}
关于c++ - 在 Gmock 的 EXPECT_CALL 之前使用 ON_CALL 时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16702119/