如何使用(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

回到顶部