我可以在设置期望后复制一个 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.
}
我想在我的测试装置 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.
}