0

私はJava Mockitoフレームワークとモッキングのコンセプトで遊び始めました。この基本的なシナリオをテストする方法を説明していただけませんか?

1 つの公開メソッド (計算) といくつかの非公開/保護メソッドを持つユースケース A があります。計算の途中で、別のユースケースが (B) と呼ばれます。B を呼び出すには、多くの引数を準備する必要があります。B も非常に複雑な出力を生成します。B への実際の呼び出しを自分のスタブに置き換えることができるような方法でテストを準備したいと思います-非常に些細なケースです。ただし、Aにはパブリックメソッドの計算が1つしかなく、保護されたメソッドにアクセスするために同じパッケージでテストを作成したくありません。クラスAを再設計すると、救済よりも多くの問題が発生する可能性があります-それは私が設計したものではありません.コードのさまざまな部分の間にいくつかの関係があり、パブリックメソッドで新しいクラスを作成するのが少し奇妙です.

いくつかの提案や読み物を教えていただけますか?

4

2 に答える 2

1

実際の B を Mockito (またはその他のモック フレームワーク) を使用して独自のものに置き換えるには、コンストラクターを作成して手動で B を注入できる必要があります。

public A(B b) { localB = b; }

メソッドを作成することで

public void setB(B b) { localB = b; }

または、自動注入フレームワークを使用して。

ただし、B が完全にカプセル化されて隠され、変更できない場合は、B に対するテストを記述して、既知の入力 B が期待される出力を返すことを示すことができます。

次に、 A に対してテストします。つまり、既知の入力が与えられた場合、 A.calculate() は期待される出力を返します。

B が期待どおりに動作し、A が期待どおりに動作することを示すことができれば、暗黙的にテストしているため、A が B を明示的に正しく呼び出していることを示す必要はありません。


@david wallaceは私よりもコーヒーが少ないか睡眠が多いため、編集しました!

モックBを注入する必要はありませんそれが役立つ場合は、実際の B を注入できますが、最初にスパイを作成します。 a.getB();

B spyB = spy(new B());
//maybe stub the method return here    
A a = new A(spyB);
a.calculate();
verify(spyB).complicatedThingForCalculate("a", "lot", "of", "specified", "parameter");

さらに編集:コメントで指摘されているように、スパイよりもモックを使用する方がはるかに優れています。ドキュメントから:

本物のスパイは、レガシー コードを扱う場合など、慎重に時折使用する必要があります。

AとBを変更したくない/自由に変更できないとあなたが言うので、ここに含めました.

于 2012-10-01T17:18:41.680 に答える
0

おそらく、クラスAはクラスBのインスタンスを作成します。代わりにモックインスタンスを作成するのは難しいため、これは常にテスト容易性の問題を引き起こします。これを処理するための本当に良い方法の1つは、クラスBのファクトリクラスの注入を許可することです。これは、このトピックに関する私のwiki投稿の「パターン2」です。

于 2012-10-01T18:27:10.367 に答える