GMock вызывает неверную макетированную функцию - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть две чисто виртуальные функции:

virtual bool IsTypeAllowed(
      const std::string& policy,
      eType type) const = 0;
virtual bool IsSubTypeAllowed(
      const std::string& policy,
      const std::string& request) const = 0;

издевались в классе Mock, вот так:

MOCK_CONST_METHOD2(IsTypeAllowed,
                     bool(const std::string& policy,
                          eType type));
MOCK_CONST_METHOD2(IsSubTypeAllowed,
                     bool(const std::string& policy,
                          const std::string& request));

С ожидаемыми вызовами:

EXPECT_CALL(mock_policy_handler_,
              IsTypeAllowed(kPolicy, request_type))
      .WillOnce(Return(true));
EXPECT_CALL(mock_policy_handler_,
              IsSubTypeAllowed(kPolicy, request_subtype))
      .WillOnce(Return(false));

Там kPolicy is std::string

request_type is eType

request_subtype is std::string

Затем возникает вызов IsTypeAllowed:

policy_handler.IsTypeAllowed(kPolicy,request_type)

это идет вразрез с IsSubTypeAllowed.

Я слышал, что GMock может «запутать» функции, если у него одно и то же имя и общая подпись, что на самом деле не мой случай из-за разных имен функций.

Это распространенная ошибка, и есть ли решение?

1 Ответ

0 голосов
/ 27 апреля 2020

Так что в моем случае это был другой виртуальный метод в базовом классе mock-класса, объявленный с помощью ifdef, что-то вроде этого:

#ifdef SOME_VARIABLE
    virtual void func() = 0;
#endif

, который вызывал смещение функции в vtable, в случае, если 'SOME_VARIABLE' не был не определено.

Так что GMOCK или GTEST делать нечего.

...