私が持っている人のような単純な、ほとんど価値のようなクラス:スタティック/グローバル機能をモックする最も簡単な方法は?
class Person
{
public:
Person(ThirdPartyClass *object);
virtual ~Person(void);
virtual std::string GetFullName() const;
virtual int GetAge() const;
virtual int GetNumberOfDaysTillBirthday() const;
};
私はDestroy
(サードパーティのライブラリの一部)と呼ばれるグローバル/静的な機能を持っているサードパーティのライブラリとThirdPartyClass
ニーズを使用していますそれを破壊するためにそれを求めた。このDestroy
関数は、Personデストラクターで呼び出されます。
私はPersonクラスを単体テストしようとしていますが、私はDestroy
メソッドを模擬/スタブする方法が必要です。私は静的Destroy
関数の周りにラッパークラスを書くことができ、次に、このラッパーをPersonクラスに挿入するために依存関係注入を使用することができると思うが、この単純なクラスでこの1つの関数を呼び出すためには、これを行う簡単な方法は何ですか?それとも、依存性注入は本当にこれを行うための最良の方法ですか?
更新
最終的に私はすべてのサードパーティのライブラリのグローバル関数をラップするクラスを作成し、私のPersonクラスのコンストラクタにこのクラスを渡すために、依存性注入を使用して行くことにしました。この方法で、私はDestroyメソッドをスタブすることができます。 Personクラスはただ1つの関数しか使用していませんが、ライブラリの他の関数はコード内の他のポイントで呼び出され、それらをテストする必要があるため同じ問題に直面します。
メインのアプリケーションコードでこのラッパークラスのインスタンスを1つ作成し、必要に応じて注入します。私はそれがはっきりしていると思うので、私はこのルートに行くことを選んだ。私はBilly ONealのソリューションが好きで、私の質問に答えると思いますが、コードを数ヶ月間残しておけば、依存性注入と比較して何が起こっているか把握するのに時間がかかります。私はPythonの嫌疑の禅を思い出させている "明示的な暗黙のより良いです。私は依存性注入が起こっていることをもう少し明示していると感じています。
静的/グローバル関数をスタブとして作成して呼び出すだけで何が問題になりますか? – littleadv
@ littadadv:単なる単体テストになっていますが、私が理解していることは、あなたがテストするクラスをテストするためだけに変更したくないということです。だから私が正しく理解したら、スタブを作成してメソッドを破棄し、それを私のPersonクラスで使用して、自分のPersonクラスを変更して、テストバージョンとプロダクションバージョンを何とか切り替える必要があります。 – User
@User - あなたがテストしているクラスを変更しないで、スタブとして独自の 'ThirdPartyClass'を実装してください。 – littleadv