我已阅读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)时,编译器会抱怨使用已删除的复制构造函数。我不认为有一种方法可以解决这个问题,以便强加移动语义(至少不是通过我尝试过的天真的方法),只是告诉它返回原始指针并希望它可以将它自己包裹起来也失败了(也可能是天真的),所以我被困住了。
此时我真的倾向于制作一个假的,但我想用纯粹的嘲弄给它最后一次拍摄。如果有某种方式我可以让这种恢复工作,这将是太棒了。无论哪种方式,我都可以完全控制模拟和测试,所以只要这个案例被覆盖(希望没有黑客),这种方法的直接或间接是不是一个问题。
答案 0 :(得分:1)
我知道这篇文章很旧,您可能已经找到答案了。
但是,新的信息是,2017年4月,gmock引入了新的动作修饰符“ ByMove”。
EXPECT_CALL(*foo_, Bar(_, )).WillOnce(Return(ByMove(some_move_only_object)));