2017-12-24 14 views
1

私はいくつかのクラスに依存関係を挿入します。このクラスは、依存関係をstd::unique_ptrで保存するため、オブジェクトの唯一の所有者です。gmockで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 
} 

答えて

2

*(dep.get())*depによって直接置き換えることができます。

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 
+0

ああ、私は以下を参照してください

その後、あなたはそれを移動する前に、期待呼び出すことができます。私はEXPECT_CALLに入ったことが、呼び出しが行われるまで有効でなければならないと考えました。 – dani

関連する問題