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)
| 归档时间: |
|
| 查看次数: |
5824 次 |
| 最近记录: |