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

时间:2015-07-31 10:59:04

标签: c++ mocking unique-ptr googlemock gmock

我已阅读Can Google Mock a method with a smart pointer return type?,但它并没有给出太多答案。

我有一个返回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)时,编译器会抱怨使用已删除的复制构造函数。我不认为有一种方法可以解决这个问题,以便强加移动语义(至少不是通过我尝试过的天真的方法),只是告诉它返回原始指针并希望它可以将它自己包裹起来也失败了(也可能是天真的),所以我被困住了。

此时我真的倾向于制作一个假的,但我想用纯粹的嘲弄给它最后一次拍摄。如果有某种方式我可以让这种恢复工作,这将是太棒了。无论哪种方式,我都可以完全控制模拟和测试,所以只要这个案例被覆盖(希望没有黑客),这种方法的直接或间接是不是一个问题。

1 个答案:

答案 0 :(得分:1)

我知道这篇文章很旧,您可能已经找到答案了。

但是,新的信息是,2017年4月,gmock引入了新的动作修饰符“ ByMove”。

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