4

基本クラスでオーバーライドされていない非仮想/仮想メソッドをモックし、派生クラスのメソッドだけをテストするにはどうすればよいですか? ここでのケースは次のとおりです。外部サーバーに接続し、他のいくつかのことを行うメソッドを持つ基本クラス X があります。X から派生したクラス Y があります。Y に 2 つのメソッドを実装しました。単体テストを行いたいだけです。これらの 2 つのメソッドだけが心配であり、サーバーなどに接続するために基本クラスの実装が呼び出されることは望ましくありません (これらのメソッドをモックアウトしたいのですが、派生クラスでこれらのメソッドをオーバーライドしたくありません)。 Y であり、製品コードであるため、何もしません)。これらのメソッドを単独で単体テストする方法についての考え/アイデアはありますか?

PS: 開発と単体テストに C++/GTest を使用しています。

4

2 に答える 2

4

1 つのオプションは、Mock_base クラスとそれを継承する Derived クラスを test ディレクトリに作成することです。何もしない関数を使用して、興味のない実際の Base の実装をモック アウトします。たとえば、Mock_base::Connect() は SUCCESS リターン コードを返す場合があります。このようにして、ソース コードを変更せずに Derived:funcs() を単体テストできます。

于 2011-10-22T18:54:49.867 に答える
3

これを行うのに苦労しているあなたは本当に幸運です!

ほとんどの場合、機能は継承によって再利用されることを意図していません。これがその正当な理由の 1 つです。基本クラスは、クライアント(つまり、Y)用にモックアウトしたいインターフェイスを実装しています。おそらく、この機能は後で他のクラスによっても実装される可能性があり、Y はその新しい、おそらくより優れた実装を使用できるはずです。

Yは X を持っている/使用していますが、Y は X ではありません。

Y クラスがX の機能 (サーバーへの接続など)を使用する必要がある場合、それを継承するのではなく、集約する必要があります。

集計スキームでは、そのようなモックが可能であることに気付くでしょう。

于 2011-10-22T18:55:40.127 に答える