4

スーパークラスのコンストラクター呼び出しとそのsuper()呼び出しをモックできるかどうか知りたいです。

たとえば、私は次のクラスを持っています

class A
{
    A(..)
    {
        super(..)
    }
}   

class B extends A
{
    B(C c)
    {
        super(c)
    }
}

そのため、クラスBのいくつかのメソッドを単体テストすることを計画していますが、インスタンスを作成すると、スーパークラスコンストラクターが呼び出されるため、単体テストを作成するのが難しくなります。では、どうすればすべてのスーパークラスコンストラクター呼び出しをモックできますか。また、クラスAのいくつかのメソッドをモックして、必要に応じていくつかの値を返すようにします。

ありがとう!!

4

3 に答える 3

1

PowerMockライブラリを使用できます。あなたがあなたのようなことを成し遂げる必要があるとき、それは本当に命の恩人です。 https://github.com/powermock/powermock/wiki/Suppress-Unwanted-Behavior

于 2012-05-03T06:37:48.977 に答える
1

コンストラクターをモックすることは非常に悪い考えです。そうすることで、本番環境で発生する動作を回避できます。これが、スレッドの開始や外部依存関係の呼び出しなど、コンストラクターで作業を行うことが設計上の欠陥である理由です。

コンストラクターで実行された作業は、テストしようとしている動作に影響を与えないと正直に言うことができますか?答えが「いいえ」の場合、テスト環境では合格するが本番環境では失敗するテストを作成するリスクがあります。答えが「はい」の場合、それはその「作業」をコンストラクターの外に移動するための明白なケースです。もう1つの方法は、テストしようとしている動作を別のクラス(おそらくそれ自体)に移動することです。

これは、GuiceのようなDIフレームワークを使用している場合はさらに当てはまります(そのようにタグ付けしたためだと思います)。

于 2012-05-03T22:53:07.300 に答える
0

あなたの質問に対する簡単な答えは「正確ではない」です。スーパーは言うまでもなく、コンストラクターを「モック」することはできません。また、super.anyMethodをモックすることは、私が精通しているフレームワークをモックすることでは困難または不可能です。Powermockを使用すると、スーパーコンストラクターや問題のあるメソッドを抑制できます。これは、それらをモックすることとはまったく同じではありませんが、役立つ可能性があります。

BがAを拡張すると、もちろん完全にAと結合します。それ自体は問題ではありませんが、問題になる可能性があり、ここにあるように見えます。BにAを拡張させる代わりに、代わりにBにAを含めるようにしてください(必要に応じて同じインターフェースを実装することもできます)。次に、モックAを挿入して、必要なすべての呼び出しを委任できます。ユニットテストははるかに簡単ですよね?

テスト駆動開発の利点の1つは、テスト中に設計でこれらのことを発見することです。

于 2012-05-03T03:41:54.430 に答える