繁体   English   中英

如何在Google Mock中模拟返回类型为unique_ptr的方法?

[英]How can I mock a method with a return type of unique_ptr in Google Mock?

我已经阅读了Google Mock可以使用智能指针返回类型的方法吗? 但它并没有给出太多答案。

我有一个返回unique_ptr实例的工厂。 返回unique_ptr是一个要求,如果没有很好的理由就不能改变,并且要与那些高于我工资等级的人进行讨论(如果事实证明你不应该返回这些东西,我愿意这样做)。

在被测试的代码中,有三个对象存在问题。 第一个是各种处理程序。 使用该处理程序,您可以创建第二个对象,这是在完成所有操作后唯一真正有趣的对象。 但是创建第二个是一个复杂的过程,需要特定处理程序实例完成额外的工作,以及工厂(第三个对象)来处理创建Mr. Second所需的逻辑,而不管处理程序的要求如何。

这是有问题的测试代码(更改类名以避免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引入了一个新的Action修饰符“ByMove”。

EXPECT_CALL(*foo_, Bar(_, )).WillOnce(Return(ByMove(some_move_only_object)));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM