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

daw*_*623 5 c++ mocking unique-ptr googlemock gmock

我已阅读Google 能否模拟具有智能指针返回类型的方法?但它并没有真正给出太多答案。

我有一个返回 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());
}
Run Code Online (Sandbox Code Playgroud)

正如人们所料,在编译这个(特别是使用 GCC)时,编译器会抱怨使用删除的复制构造函数。我不认为有办法解决这个问题以强加移动语义(至少不是通过我尝试过的公认的幼稚方法),只是告诉它返回原始指针并希望它可以自己包装它也失败了(也可能很幼稚),所以我被卡住了。

在这一点上,我真的倾向于制作一个假货,但我想用纯粹的嘲笑给它最后一次机会。如果有什么方法可以让我重返工作岗位,那就太棒了。无论哪种方式,我都可以完全控制模拟和测试,因此只要这种情况被覆盖(希望没有黑客攻击),该方法的直接或间接程度就不是问题。

小智 9

我知道这篇文章很老了,你现在可能已经找到了答案。

然而,一个新的信息是在 2017 年 4 月,gmock 引入了一个新的动作修饰符“ByMove”。

EXPECT_CALL(*foo_, Bar(_, )).WillOnce(Return(ByMove(some_move_only_object)));
Run Code Online (Sandbox Code Playgroud)

  • 语法实际上是“ByMove(std::move(some_move_only_object))”。另请注意,返回“nullptr”还需要“ByMove(nullptr)”。 (9认同)