如何在谷歌模拟中模拟一个返回类型为unique_ptr的方法

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

本文关键字:模拟 unique 返回类型 一个 ptr 方法 谷歌      更新时间:2023-10-16

我已经阅读了谷歌可以模拟一个智能指针返回类型的方法吗?但它并没有给出一个真正的答案。

我有一个返回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)));