2017-10-05 19 views
1

ローカルオブジェクト内でそのクラスのメソッドを呼び出すためにインスタンス化されるシナリオ、つまりsetSessionId()があります。googlemockを使用して集約オブジェクトによって呼び出されるモック関数

int Cli::setSessionId() 
{ 
    SessionHandler oHandleSession; 
    return oHandleSession.getSessionId(sSessionId); 
} 

SessionHandlerのモック機能させるために私が使用しているマクロを、このクラスは、抽象的で機能はないので、この場合getSessionId()には、私はモックとしたい関数の前にvirtualキーワードを追加するために次のようにsetSessionIdのDefinationであります純粋仮想ではありません。(私はこんにちはパーフォレーション依存性注入について知っているが、この段階でそれに行きたくない)

場合は、この

int Cli::setSessionId(SessionHandler* oHandleSession) 
{ 
    ... 
    return oHandleSession->getSessionId(sSessionId); 
} 

されていたそれはちょうどPAにシンプルだっただろう模倣されたオブジェクトは関数setSessionid()にありますが、集約が使用されているので、この関数をどうやって模擬することができますかgetSessionId()

答えて

1

静的多型を使用することも、リンク時置換を使用することもできます。あなたはこのような何かを静的ポリモーフィズムのために

class DefaultSessionHandler { 
    // methods implemented as you do now 
}; 

template <typename T> 
class SessionHandlerT { 
    // methods implemented in terms of delegation to methods on T 
}; 

using SessionHandler = SessionHandlerT<DefaultSessionHandler>; 

これは少し面倒にすることができ、追加のコンパイル時間を導入し、それを動作させることができる一方で、私はのファンの多くはないんだけどできこのアプローチは、私が以前に何度もやったことがあったとしても。

リンク時の置換では、SessionHandlerの代替実装を提供し、リンク時の状況を解決します。これは、同じ名前を持っていても、何か違うことをするSessionHandlerクラスの実装があることを意味します。繰り返しますが、これは面倒ですが、仕事をすることができます。

これらの方法にはそれぞれ独自の問題と苦痛があります。ユニットテストのより良い方法は、単にSUTをリファクタリングすることによって依存性注入を使用することです。

もう1つのアプローチは、単体テストを控え、統合テストのみを実行することです。これには独自の問題もあります。

関連する問題