【问题标题】:Can I copy a google mock object after setting expectations?设置期望后,我可以复制谷歌模拟对象吗?
【发布时间】:2016-01-07 17:16:12
【问题描述】:

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

例如:

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 的成员,因为只有一些测试使用该特定的模拟(并且我应该只填充模拟行为,如果测试是使用它)它会不那么干净。

【问题讨论】:

  • 我怀疑调用期望是指特定的模拟实例,所以这些不会自动推迟到模拟的副本(无论如何这有意义吗?)。 “所以我假设不能复制模拟”? 每个 SE 的模拟类应该是可复制的 IIRC。
  • 糟糕,下面的post 似乎证明我的记忆是错误的。似乎任何模拟对象都不可复制。
  • 是的,只需删除 MOCK_METHODX 并替换为 Listener 方法的常规实现即可使其编译。你是对的,那个帖子几乎解释了它。 :-(
  • 您是否尝试过自己明确地实现复制行为?尽管期望不能以任何方式被复制。我会尝试使用一个单独的函数来为要在设置中使用的任意模拟实例创建期望。
  • 我的主要目的是复制预期。你提到的帖子说他们不会。

标签: c++ unit-testing googletest googlemock


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    好吧,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;
        }
    };
    

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

    TEST_F(MyTest, MyTestUsingSpecialListener) {
        MockListener special;
        setSpecialListenerExpectations(special);
    
        // Do something with special.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2015-11-21
      • 2015-03-20
      • 1970-01-01
      相关资源
      最近更新 更多