Переменная 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(""));
}