设置EXPECT_CALL以将调用重定向到原始方法

时间:2014-08-28 19:30:49

标签: gmock

我有一个有几种相互依赖的方法的类。让我们说foo(),bar()和baz()。

当我测试bar()时,我需要模拟foo()的行为,当我测试baz()时,我需要模拟bar()的行为。

如果我为baz模拟吧,我不能使用相同的模拟类来测试带有模拟foo()的吧。

我的问题是我可以设置EXPECT_CALL来实际调用原始行为以及如何调用。这将消除创建多个Mock类的需要。

2 个答案:

答案 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);
}