У меня есть ошибка компилятора с gmock и шаблонным классом, который должен использоваться в качестве основы для производных (конкретных) классов.
Цель состоит в том, чтобы протестировать методы обратного вызова, поддерживаемые каркасом, но базовые классы каркаса зависят от конечной реализации (короче говоря, это каркас стиля шаблона CRTP, который внедряет объявления статического интерфейса) —
Я пытаюсь набросать то, что у меня есть (пожалуйста, не полагайтесь на компилируемый код с 1-й попытки):
Это определение интерфейса перехватчиков фреймворка, которое зависит от параметра шаблона Context, сам базовый класс фреймворка обрабатывает его как неполиморфный вызов и предоставляет реализацию по умолчанию:
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()
макрос для параметра шаблона как-нибудь? Или я скучаю по Sth. еще ??
Я думаю, что вам нужна шаблонная версия макросов Gmock, которые имеют _T
прилагается:
MOCK_METHOD1_T(funcImpl, void (Context* context));
Для получения дополнительной информации см. Раздел «Шаблоны классов Mocking» в документы.
Других решений пока нет …