我有一个有几种相互依赖的方法的类。让我们说foo(),bar()和baz()。
当我测试bar()时,我需要模拟foo()的行为,当我测试baz()时,我需要模拟bar()的行为。
如果我为baz模拟吧,我不能使用相同的模拟类来测试带有模拟foo()的吧。
我的问题是我可以设置EXPECT_CALL来实际调用原始行为以及如何调用。这将消除创建多个Mock类的需要。
答案 0 :(得分:6)
答案可以在googlemock CookBook
中找到简而言之,你需要写
class MockFoo : public Foo {
public:
// Mocking a pure method.
MOCK_METHOD1(Pure, void(int n));
// Mocking a concrete method. Foo::Concrete() is shadowed.
MOCK_METHOD1(Concrete, int(const char* str));
// Use this to call Concrete() defined in Foo.
int FooConcrete(const char* str) { return Foo::Concrete(str); }
};
和
ON_CALL(foo, Concrete(_))
.WillByDefault(Invoke(&foo, &MockFoo::FooConcrete));
答案 1 :(得分:0)
您可以在不添加任何其他方法的情况下执行此操作,并使用不同寻常的调用语法:obj.Parent::method()
或ptr->Parent::method()
。
例如:
struct Foo
{
virtual int bar() const { return 42; }
};
struct MockFoo : public Foo
{
MOCK_CONST_METHOD0(bar, int());
};
TEST(Demo, mock_can_call_parent)
{
MockFoo mock;
EXPECT_CALL(mock, bar()).WillOnce([&mock](){
return mock.Foo::bar(); // trick is here
});
EXPECT_EQ(mock.bar(), 42);
}