5

コンポジションを使用すると、テスト対象のクラスが依存する他のオブジェクトをモックできますが、継承を使用すると、基本クラスをモックできません。(またはできますか?)

私は通常、継承よりも構成を優先しようとしますが、継承が実際に仕事に最適なツールのように思えることがあります-まあ、少なくとも単体テストになるまでは。

では、どのように継承をテストしますか? それとも、テスト不可能として破棄し、代わりにコンポジションを使用しますか?

注:私は主に PHP と PHPUnit を使用しています。しかし、他の言語でこの問題の解決策があるかどうかを知ることも興味深いでしょう.

4

5 に答える 5

5

クラス階層を反映した一連の単体テストを使用します。基本クラス Base と派生クラス Derived がある場合は、テスト クラス BaseTests と、その DerivedTests から派生したクラスを作成します。BaseTests は、Base で定義されたすべてのテストを担当します。DerivedTests はこれらのテストを継承し、Derived 内のすべてのテストも担当します。

Base で保護された仮想メソッド (つまり、Base とその子孫クラスの間のインターフェイス) をテストする場合は、そのインターフェイスをテストするテスト専用の派生クラスを作成することも理にかなっています。

于 2008-09-22T17:45:40.213 に答える
4

親クラスのパブリック メソッドをオーバーライドしない限り、そのすべてのサブクラスでそれらをテストする必要がある理由がわかりません。親クラスのメソッドを単体テストし、サブクラスの新しいメソッドまたはオーバーライドされたメソッドのみをテストします。

于 2008-09-19T09:48:04.577 に答える
3

コンポジションでモックオブジェクトを使用する理由は、実際のオブジェクトが設定したくないことを行う場合です (ソケット、シリアルポートの使用、ユーザー入力の取得、大量のデータの取得など)。可能であれば、常に実際のオブジェクトを使用する必要があります。モック オブジェクトは、実際のオブジェクトを使用してテストを実装および維持するための推定労力が、モック オブジェクトを使用してテストを実装および維持するための労力よりも大きい場合にのみ使用されます。あなたの基本クラスは、そのような派手なことをするべきではありません!

したがって、継承をテストする必要はありません。おそらく、基本クラスの動作を使用しているので、通常どおりに派生クラスをテストするだけです。テストに応じて、基本クラスと派生クラスの両方でメソッドを呼び出します。これにより、派生クラスの意図したすべての動作がテストされます。

基本的に、(ほとんどの場合) 基本クラスが見えないかのように派生クラスをテストします。

于 2008-09-19T10:08:38.363 に答える
1

なぜ基本クラスをモックする必要があるのですか?

存在しない親クラスからどのように派生クラスを作成できますか?

いつものようにテストするだけですが、親クラスがあります。

私はあなたがすべての話をしていないと思います。

さらに、言語機能は (ベータ リリースなどで作業している場合を除いて) 動作すると思われるため、派生クラスにメソッドが実際に存在するかどうかをテストする必要はありません。

于 2008-09-19T09:49:22.823 に答える
0

いいえ、あなたはしません。オーバーライドされたメソッドが本来の動作をすることを確認するだけです。親メソッドの動作に影響を与えることは決してありません。親メソッドが失敗し始めた場合は、親レベルでテストしたときにバインド条件を逃したことを意味します。

于 2008-09-19T12:02:44.757 に答える