如何模拟GTest中模板类中的模板方法?



我想在谷歌测试中模拟myFunction,但这两个模板有问题。

template <class Outer>
class MyClass{
template <class T>
void myFunction(const int a, T * b);
};

首先,Outer模板类型在这里不是问题,因为它没有在myFunction签名中使用
要处理类型T,您需要对测试期间使用的所有类型完全专门化模拟方法
假设您想用T=std::string:测试该方法

template <class Outer>
class MyClassMock {
public:
MOCK_METHOD(void, myFunction, (const int, std::string*));
template <class T>
void myFunction(const int a, T* b);
template <>
void myFunction(const int a, std::string* b)
{
myFunction(a, b);
}
};

如果你的测试功能将有这样的签名:

template <typename TMyClass>
void UseMyClassWithString(TMyClass& i_value)
{
std::string t;
i_value.myFunction(5, &t);
}

结果测试可能看起来像这样:

TEST(UseMyClass, ShouldCallMyFunction)
{
MyClassMock<size_t> mock;
EXPECT_CALL(mock, myFunction).Times(1);
UseMyClassWithString(mock);
}

这里的Outer类型是size_t,它只用于创建mock对象。

最新更新