如何将(GoogleMock)模拟类用作模板参数

3

我使用策略设计模式实现了一个类,我需要使用googletest/googlemock进行测试。例如,在下面的代码中,我想要测试class Foo,并且想要使用一个mock类来代替class Bar。是否可以使用google test框架进行测试?

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();
}
2个回答

0

你可以使用gmock来测试模板。 但是,由于在你的情况下,没有"直接"访问模拟对象的权限,因此需要自己实现此访问 - 例如,使用Mock类的静态成员变量 - 参见:

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();

0

无法测试它,因为模板参数是Foo模板类的私有基类。

如果您决定提供对其基类的访问(将继承更改为公共或从方法中),那么就很简单:只需创建一个mock类,并用作模板参数即可。

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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接