我在某个类中注入了一个依赖项。此类使用std::unique_ptr
存储依赖项,因此是该对象的唯一所有者。
在此依赖项中模拟方法的正确方法是什么?我目前的解决方案是在交出所有权之前从unique_ptr
获取一个原始指针。虽然这有效,但我认为还有更好的方法。这些是什么?
class Dependency
{
public:
virtual int plusOne(int x) {return x+1;}
};
class Dependency_Mock : public Dependency
{
public:
MOCK_METHOD1(plusOne, int(int));
};
class SomeClass
{
public:
void inject(std::unique_ptr<Dependency> dep) {dependency = std::move(dep);}
int execute(int x) {return dependency->plusOne(x);}
private:
std::unique_ptr<Dependency> dependency;
};
TEST(SomeClassTest, executeTestWithMock)
{
SomeClass some;
auto dep = std::make_unique<Dependency_Mock>();
auto& dep_ref = *(dep.get()); // This is kind of ugly.
some.inject(std::move(dep));
EXPECT_CALL( dep_ref , plusOne(_))
.WillOnce(Return(5));
EXPECT_EQ(some.execute(5), 5); // execute
}
*(dep.get())
可以直接替换*dep
。
然后,您可以在调用expect之前移动它:
auto dep = std::make_unique<Dependency_Mock>();
EXPECT_CALL(*dep, plusOne(_)).WillOnce(Return(5));
SomeClass some;
some.inject(std::move(dep));
EXPECT_EQ(some.execute(5), 5); // execute