如何在谷歌模拟中模拟一个返回类型为unique_ptr的方法
How can I mock a method with a return type of unique_ptr in Google Mock?
我已经阅读了谷歌可以模拟一个智能指针返回类型的方法吗?但它并没有给出一个真正的答案。
我有一个返回unique_ptr实例的工厂。返回unique_ptr是一个不能更改的要求,除非有很好的理由,并与我的上级讨论(如果事实证明你不应该返回这些东西,我愿意这样做)。
在被测试的代码中,有三个对象存在问题。第一个是各种处理程序。使用该处理程序,您可以创建第二个对象,这是在完成所有操作之后唯一真正有趣的对象。但是创建第二个对象是一个复杂的过程,需要由特定的处理程序实例完成额外的工作,以及一个工厂(第三个对象)来处理创建第二个对象所需的逻辑,而不管处理程序的需求如何。
下面是有问题的测试代码(更改了类名以避免HR地狱):
class BarTest : public ::testing::Test
{
protected:
Bar foo;
};
TEST_F(BarTest, createFoo)
{
// Data used in this test
std::string fooName = "test";
MockFooFactory<int> fooFactory;
MockFoo<int>* foo = new MockFoo<int>;
// When createFoo is called, it should call the foo factory's construct method with the given
// fooName and a pointer to the calling bar
EXPECT_CALL(fooFactory, construct(fooName, &bar)).
WillOnce(::testing::Return(std::unique_ptr<Foo<int>>(foo)));
// Test it
std::unique_ptr<Foo<int>> returnedFoo = bar.createFoo(fooName, fooFactory);
// createFoo should return the foo returned by the factory's construct method
ASSERT_EQ(foo, returnedFoo.get());
}
正如人们所预料的那样,在编译它(特别是使用GCC)时,编译器会抱怨使用了删除的复制构造函数。我不认为有一种方法可以欺骗这个,以强加移动语义(至少不是通过我尝试过的公认的天真的方法),只是告诉它返回原始指针,并希望它可以自己包装它也失败了(潜在的天真),所以我卡住了。
在这一点上,我真的倾向于做一个假,但我想给它最后一次纯粹的嘲笑。如果有什么办法能让我重返工作岗位,那就太好了。无论哪种方式,我都可以完全控制模拟和测试,因此只要覆盖了这种情况(希望没有恶意),方法的直接或间接方式都不是问题。我知道这篇文章很老了,你现在可能已经找到答案了。
然而,一个新的信息是,在2017年4月,gmock引入了一个新的动作修饰符"ByMove"。
EXPECT_CALL(*foo_, Bar(_, )).WillOnce(Return(ByMove(some_move_only_object)));
相关文章:
- 如何使用Google Mock来模拟gettimeofday()
- 为什么 std::unique 不调用 std::sort?
- G锁定铸造到基础上会释放模拟行为
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 落砂模拟碰撞检测C++和SFML
- 在gtest.中使用fff.h模拟系统API
- 谷歌模拟和覆盖关键字
- 用C#中的并集模拟C++嵌套结构
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 我写了一个C++程序来模拟Enigma机器.我没有得到输出
- 如何模拟不同边数的骰子滚动?
- 模拟持久按键
- 使用SIR模型的疾病爆发模拟
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 转发变量参数列表以模拟 std::thread
- 如何在谷歌模拟中匹配 C 样式数组
- 如何使用兰德随机化模拟点击
- 生成"unique"矩阵
- 模拟GPS数据,以便使用Qt与Traccar一起使用