我可以在设定期望后复制谷歌模拟对象吗?

时间:2015-10-09 17:00:57

标签: c++ unit-testing googletest googlemock

我想在我的测试夹具类中添加一个实用程序函数,它将返回一个具有特定期望/操作集的模拟。

E.g:

class MockListener: public Listener
{
    // Google mock method.
};

class MyTest: public testing::Test
{
public:
    MockListener getSpecialListener()
    {
        MockListener special;
        EXPECT_CALL(special, /** Some special behaviour e.g. WillRepeatedly(Invoke( */ );
        return special;
    }
};

TEST_F(MyTest, MyTestUsingSpecialListener)
{
    MockListener special = getSpecialListener();

    // Do something with special.
}

不幸的是我得到了:

error: use of deleted function ‘MockListener ::MockListener (MockListener &&)’

所以我假设嘲笑无法复制?为什么,如果有另外一种优雅的方式来获得一个功能来制造一个已经设定了期望/行动的现成模拟?

显然我可以让getSpecialListener返回一个MockListener&,但是它会不必要地成为MyTest的成员,因为只有一些测试使用那个特定的模拟(我应该只填充模拟行为,如果测试它正在使用它)它会更不干净。

2 个答案:

答案 0 :(得分:1)

好吧to copy mock class instances似乎不可能正确,特别是没有深刻复制任何与他们有关的期望。

您可以做的是,在测试类中提供辅助函数,在模拟实例上设置特定的期望,例如:

class MyTest: public testing::Test {
public:
    MockListener& setSpecialListenerExpectations(MockListener& special) 
             // ^                                            ^
    {
        EXPECT_CALL(special, /** Some special behaviour e.g.  WillRepeatedly(Invoke( */ );
        return special;
    }
};

并在测试用例中将它们设为 special

TEST_F(MyTest, MyTestUsingSpecialListener) {
    MockListener special;
    setSpecialListenerExpectations(special);

    // Do something with special.
}

答案 1 :(得分:1)

模拟对象是不可复制的,但您可以编写一个工厂方法,该方法返回指向新创建的模拟对象的指针。要简化对象所有权,您可以使用std::unique_ptr

std::unique_ptr<MockListener> getSpecialListener() {
  MockListener* special = new MockListener();
  EXPECT_CALL(*special, SomeMethod()).WillRepeatedly(DoStuff());
  return std::unique_ptr<MockListener>(special);
}

TEST_F(MyTest, MyTestUsingSpecialListener) {
  std::unique_ptr<MockListener> special = getSpecialListener();

  // Do something with *special.
}