EXPECT_CALL на шаблон макета - PullRequest
0 голосов
/ 21 мая 2018

У меня макет определен следующим образом:

template<typename T>
class ParseTreeMock : public ParseTreeInterface<T> {
    public:
        MOCK_METHOD1(fillConfigTree, void(std::string const&));
        MOCK_METHOD1_T(getProperty, T(std::string const&));
        ParseTreeMock(): parseTree(std::make_unique<pt::ptree>()) {
        }
        static std::unique_ptr<ParseTreeInterface<T>> getDefaultTree() {
            return std::make_unique<ParseTreeMock<T>>();
        }
    private:
        std::unique_ptr<pt::ptree> parseTree;
};

, который создается позже в тестовом примере:

class ConfigTest : public ::testing::Test {
    protected:
        std::unique_ptr<ParseTreeInterface<std::string>> treeMock;
        virtual void SetUp() {
            treeMock = ParseTreeMock<std::string>::getDefaultTree();
        }
};

И я хочу установить возвращаемое значение для метода getProperty:

EXPECT_CALL(*treeMock, getProperty("miniReaderConfig.cacheConfig.cacheOnOff")).willOnce(Return(false));

Я получаю ошибку:

In file included from ./lib/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h:43:0,
                 from ./lib/googletest/googlemock/include/gmock/gmock.h:61,
                 from ./test/UT/Mocks/ParseTreeMock.hpp:2,
                 from test/UT/Configuration/ConfigTest.cpp:1:
test/UT/Configuration/ConfigTest.cpp: In member function ‘virtual void ConfigTest_CreateConfigurationWithoutErrors_Test::TestBody()’:
./lib/googletest/googlemock/include/gmock/gmock-spec-builders.h:1844:12: error: ‘class miniReader::Configuration::ParseTreeInterface<std::__cxx11::basic_string<char> >’ has no member named ‘gmock_getProperty’; did you mean ‘getProperty’?
     ((obj).gmock_##call).InternalExpectedAt(__FILE__, __LINE__, #obj, #call)

Любое решение с объяснением ошибки приветствуется.

1 Ответ

0 голосов
/ 22 мая 2018

Переменная treeMock должна иметь тип std::unique_ptr<ParseTreeMock<std::string>>, и тогда статический метод должен выглядеть следующим образом

static std::unique_ptr<ParseTreeMock<T>> getDefaultTree()
{
  return std::make_unique<ParseTreeMock<T>>();
}

Обычно вы создаете экземпляр класса, который реализует интерфейс в вашем тесте, а затем передаетеэкземпляр класса, который вы тестируете, и EXPECT_CALL s гарантирует, что класс, который вы тестируете, вызывает обратные вызовы для вашего фиктивного объекта.

Не связано с ошибкой, которую вы получили, но WillOnce должно быть написано с первой заглавной буквой.Кроме того, поскольку для переменной шаблона установлено значение std::string, EXPECT_CALL не может ожидать возврата логического значения.

Это компилируется для меня:

  namespace pt { struct ptree {};}

  template<typename T>
  class ParseTreeInterface
  {
   public:
    virtual void fillConfigTree(std::string const&) = 0;
    virtual T getProperty(std::string const&) = 0;

  };


  template<typename T>
  class ParseTreeMock : public ParseTreeInterface<T> {
   public:
    MOCK_METHOD1(fillConfigTree, void(std::string const&));
    MOCK_METHOD1_T(getProperty, T(std::string const&));
    ParseTreeMock(): parseTree(std::make_unique<pt::ptree>()) {
    }
    static std::unique_ptr<ParseTreeMock<T>> getDefaultTree()
    {
      return std::make_unique<ParseTreeMock<T>>();
    }
   private:
    std::unique_ptr<pt::ptree> parseTree;
  };

  class ConfigTest : public ::testing::Test {
   protected:
    std::unique_ptr<ParseTreeMock<std::string>> treeMock;
    virtual void SetUp() {
      treeMock = ParseTreeMock<std::string>::getDefaultTree();
    }
  };

  TEST_F(ConfigTest, test)
  {
    EXPECT_CALL(*treeMock, getProperty("miniReaderConfig.cacheConfig.cacheOnOff")).WillOnce(::testing::Return(""));
  }
...