C++ googlemock可以从同一类的其他方法调用中调用吗?
是否可以从同一类的其他方法调用中模拟方法调用?我是新的C++(主要是C开发人员),非常新的GoGoReMokes和谷歌测试,所以请原谅我,如果这是在别处回答,我不明白答案!下面是一个简单的例子,可以解释我想做什么。使用下面的示例,我想模拟C++ googlemock可以从同一类的其他方法调用中调用吗?,c++,unit-testing,googletest,googlemock,C++,Unit Testing,Googletest,Googlemock,是否可以从同一类的其他方法调用中模拟方法调用?我是新的C++(主要是C开发人员),非常新的GoGoReMokes和谷歌测试,所以请原谅我,如果这是在别处回答,我不明白答案!下面是一个简单的例子,可以解释我想做什么。使用下面的示例,我想模拟ReturnInput,同时测试ReturnInputPlus1 using ::testing::Invoke; using ::testing::_; using ::testing::Return; class MyClass { public:
ReturnInput
,同时测试ReturnInputPlus1
using ::testing::Invoke;
using ::testing::_;
using ::testing::Return;
class MyClass
{
public:
MyClass() : x(1) {}
virtual ~MyClass() {}
int ReturnInput(int x) { return x; }
int ReturnInputPlus1(int x) { return ReturnInput(x) + 1; }
};
class MockMyClass : public MyClass
{
public:
MockMyClass()
{
ON_CALL(*this, ReturnInput(_)).WillByDefault(Invoke(&real, &MyClass::ReturnInput));
ON_CALL(*this, ReturnInputPlus1(_)).WillByDefault(Invoke(&real, &MyClass::ReturnInputPlus1));
}
virtual ~MockMyClass() {}
MOCK_METHOD1(ReturnInput, int(int y));
MOCK_METHOD1(ReturnInputPlus1, int(int));
private:
MyClass real;
};
TEST(MyClassTest, mockUseClassMethod)
{
MockMyClass mock;
EXPECT_CALL(mock, ReturnInput(_))
.WillOnce(Return(2));
EXPECT_CALL(mock, ReturnInputPlus1(_))
.Times(1);
EXPECT_EQ(3, mock.ReturnInputPlus1(1));
}
当我运行上述测试时,我希望所有测试都能成功。相反,我得到以下输出:
1>[ RUN ] MyClassTest.mockUseClassMethod
1>.\MyClassTest.cpp(15): error: Value of: mock.ReturnInputPlus1(1)
1> Actual: 2
1>Expected: 3
1>.\DllInfoTest.cpp(10): error: Actual function call count doesn't match EXPECT_CALL(mock, ReturnInput(_))...
1> Expected: to be called once
1> Actual: never called - unsatisfied and active
您对
MockMyClass::ReturnInputPlus1(1)
的调用默认情况下在real
上调用MyClass::ReturnInputPlus1(1)
调用MyClass::ReturnInput(2)
。运行ReturnInputPlus1()
的对象不是mock
,而是mock.real
,当它调用ReturnInput()
时,它调用函数的原始版本。您要做的是创建一个MockMyClass,它具有对ReturnInput()
的模拟覆盖,但根本不模拟ReturnInputPlus1()
——您不希望同时拥有类的模拟版本和它有时委托的真实版本