【发布时间】: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