У меня есть проблема с ошибкой компилятора с gmock и шаблонным фиктивным классом, который следует использовать в качестве основы для производных (конкретных) фиктивных классов.
Цель состоит в том, чтобы протестировать методы обратного вызова, поддерживаемые фреймворком, но базовые классы фреймворка зависят от окончательной реализации (короче говоря, это фреймворк стиля шаблона CRTP, который вводит статические объявления интерфейса) -
Я пытаюсь набросать то, что у меня есть (пожалуйста, не полагайтесь на компилируемый код с первой попытки):
Это определение интерфейса хуков фреймворка, которое зависит от параметра шаблона контекста, сам базовый класс фреймворка обрабатывает это как неполиморфный вызов и предоставляет реализацию по умолчанию:
template<class Context>
class IFrameworkHooks
{
public:
virtual void funcImpl(Context* context) = 0;
virtual ~IFrameworkHooks() {}
};
Теперь я хочу реализовать фиктивный класс, реализующий интерфейс IFrameWorkHooks<>
:
template<class Context, class InnerInterface>
class MyTemplateMock
: public FrameworkBaseClass<MyTemplateMock<Context,InnerInterface>,Context,InnerInterface>
, public IFrameworkHooks<Context>
{
public:
// Compiler error here:
MOCK_METHOD1(funcImpl, void (Context* context));
virtual ~MyTemplateMock() {}
protected:
MyTemplateMock()
{
// Compiler error here:
ON_CALL(*this, funcImpl(_))
.WillByDefault(Invoke(this, &MyTemplateMock<Context,InnerInterface>::funcImplCall));
}
void funcImplCall(Context* context)
{
}
};
Я получаю сообщение об ошибке компилятора:
error: need ‘typename’ before ‘testing::internal::Function<void(Context*)>::Result’ because ‘testing::internal::Function<void(Context*)>’ is a dependent scope
error: type/value mismatch at argument 1 in template parameter list for ‘template<class T> class testing::Matcher’
error: expected a type, got ‘testing::internal::Function<void(Context*)>::Argument1’
Можно ли как-то специализировать gmock Matcher, используемый в макросе ON_CALL()
для параметра шаблона? Или я что-то пропустил? еще??
testing::internal::Function<void(Context*)>::Result
? Это то, что вам нужно в сообщении об ошибке - возможно, это правильно. (Возможно, вам придется посмотреть на вывод препроцессора, чтобы выяснить, где он находится в вашем исходном коде.) - person David Schwartz   schedule 27.04.2013MOCK_METHODx()
... - person πάντα ῥεῖ   schedule 27.04.2013