установите EXPECT_CALL, чтобы перенаправить вызов на исходный метод

У меня есть класс с несколькими методами, которые зависят друг от друга. Допустим, foo(), bar() и baz().

Когда я тестирую bar(), мне нужно имитировать поведение foo(), когда я тестирую baz(), мне нужно имитировать поведение bar().

Если я издеваюсь над bar для baz, я не могу использовать тот же фиктивный класс для тестирования бара с издевательским foo().

Мой вопрос в том, могу ли я установить EXPECT_CALL для фактического вызова исходного поведения и как это сделать. Это избавит от необходимости создавать несколько Mock-классов.


person gsf    schedule 28.08.2014    source источник


Ответы (2)


Ответ можно найти в gMock Cookbook.

Короче надо писать

class MockFoo : public Foo {
public:
  // Mocking a pure method.
  MOCK_METHOD(void, Pure, (int n), (override));
  // Mocking a concrete method.  Foo::Concrete() is shadowed.
  MOCK_METHOD(int, Concrete, (const char* str), (override));
};

и

ON_CALL(foo, Concrete).WillByDefault([&foo](const char* str) {
  return foo.Foo::Concrete(str);
});

or

EXPECT_CALL(foo, Concrete).WillOnce([&foo](const char* str) {
  return foo.Foo::Concrete(str);
});
person Haozhun    schedule 12.02.2015

Вы можете сделать это без добавления каких-либо дополнительных методов, используя необычный синтаксис вызова: 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);
}
person ricab    schedule 03.04.2020