我可以在设置期望后复制一个 google 模拟对象吗?

Can I copy a google mock object after setting expectations?

我想在我的测试装置 class 中添加一个实用函数,它将 return 一个带有特定 expectations/actions 集的模拟。

例如:

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 &&)’

所以我假设模拟不能被复制?为什么,如果是的话,还有另一种优雅的方法来获得一个函数来制造一个已经设置了 expectations/actions 的现成模拟吗?

显然,我可以使 getSpecialListener return 成为 MockListener&,但这样就不必要地需要成为 MyTest 的成员,并且因为只有一些测试使用该特定模拟(而且我应该只填充模拟行为(如果测试正在使用它)它会不那么干净。

好吧,这似乎不可能 to copy mock class instances 正确,尤其是不能深度复制任何绑定到它们的期望。

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

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

并在您的测试用例中使它们特殊

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

    // Do something with special.
}

模拟对象是不可复制的,但您可以编写一个工厂方法,returns 指向新创建的模拟对象的指针。为了简化对象所有权,您可以使用 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.
}