C++ GTest/GMock для шаблонов классов: вызывается настоящий метод вместо указанной фиктивной реализации

avatar
PK09
9 августа 2021 в 01:41
147
1
-1

Вот упрощенный пример (из gMock Cookbook) шаблона класса, который я хочу имитировать:

class StackInterface {
 public:
  virtual ~StackInterface();
  virtual int GetSize() const {
    return 3;
  }

};

template<typename Elem>
class MockStack : public StackInterface<Elem> {
 public:
  MockStack() : StackInterface<Elem>(){};

  MOCK_METHOD(int, GetSize, (), (const, override));

};

Я использую его следующим образом:

class StackTest : public testing::Test {
 public:
  StackTest() {
    mockStack_ = std::make_shared<MockStack<int>>();
  }

 protected:
  std::shared_ptr<MockStack<int>> mockStack_;

};

TEST_F(StackTest, TestGetSize1) {
  EXPECT_CALL(*mockStack_, GetSize()).WillRepeatedly(testing::Invoke([&]() -> int { return 5; }));

  StackInterface<int> myStack;
  auto res = myStack.GetSize();
  EXPECT_EQ(res, 5);
}

Этот тест не пройден, потому что возвращаемое значение равно 3, что и является моей реальной функцией. Почему моя фиктивная реализация игнорируется? Как убедиться, что используется фиктивная реализация?

Источник
Stephen Newell
9 августа 2021 в 01:59
1

Я не использовал gmock, но вы явно создаете экземпляр StackInterface<int>. Зачем вообще использовать мокап? Я ожидаю, что оптимизатор полностью де-виртуализирует вызов GetSize.

Ответы (1)

avatar
nhatnq
9 августа 2021 в 06:15
1

Метод GetSize должен быть вызван фиктивным объектом. Это mockStack_

template <typename Elem>
class StackInterface {
 public:
  StackInterface() {}
  virtual ~StackInterface() {}
  virtual int GetSize() const {
    return 3;
  }

};

template <typename Elem>
class MockStack : public StackInterface<Elem> {
 public:
  MockStack() : StackInterface<Elem>() {
        ON_CALL(*this, GetSize()).WillByDefault(Return(1)); }
  ~MockStack() {}
  MOCK_METHOD(int, GetSize, (), (const, override));
};

class StackTest : public testing::Test {
 public:
  StackTest() {
    mockStack_ = std::make_shared<MockStack<int>>();
  }
 protected:
  std::shared_ptr<MockStack<int>> mockStack_;

};

TEST_F(StackTest, TestGetSize1) {
  EXPECT_CALL(*mockStack_, GetSize()).WillRepeatedly(testing::Invoke([&]() -> int { return 5; }));

  EXPECT_EQ(mockStack_->GetSize(), 5);
}