如何使用(GoogleMock)模拟类作为模板参数
我已经实现了一个使用策略设计模式的类,我需要使用googletest/googlemock来测试它。例如。在下面的代码中,我想测试class Foo
并且想要为class Bar
使用模拟类。是否有可能使用谷歌测试框架来测试它?如何使用(GoogleMock)模拟类作为模板参数
template <typename T> class Foo : private T {
public:
void foo() {
T::bar();
}
};
class Bar {
public:
void bar() {
std::cout << "Hey there!" << std::endl;
}
};
int main() {
Foo<Bar> f;
f.foo();
}
回答:
您可以使用gmock来测试模板。 但是,由于在你这样的情况下,你没有“直接”访问模拟对象,那么你需要自己实现这个访问 - 例如,使用模拟类的静态成员变量 - 见:
class BarMock {
public:
// mocked method
MOCK_METHOD0(bar, void());
// code below is needed to keep track of created mock objects:
BarMock() { prevIntance = lastInstance; lastInstance = this; }
~BarMock() { lastInstance = prevIntance; }
BarMock* prevIntance;
static BarMock* lastInstance;
};
BarMock* BarMock::lastInstance = nullptr;
然后你就可以用这种方式进行测试:
Foo<BarMock> objectUnderTest; EXPECT_CALL(*BarMock::lastInstance, bar());
objectUnderTest.foo();
回答:
这是不可能的,以测试它,因为模板参数是一个私有基地的Foo模板类。
如果您决定提供对其基类的访问(将继承改为公共或方法),则很简单:只需创建一个模拟类并将其用作模板参数。
class BarMock {
MOCK_METHOD0(bar, void());
};
测试:
class TestFoo : public Test {
public:
TestFoo() :
mock(),
m(mock)
{
}
Foo<BarMock> mock;
BarMock& m;
};
TEST_F(TestFoo, test_m)
{
EXPECT_CALL(m, bar()).Times(1);
mock.foo();
}
以上是 如何使用(GoogleMock)模拟类作为模板参数 的全部内容, 来源链接: utcz.com/qa/258666.html