0

依存関係が渡された参照の状態を変更するときに、void メソッドの単体テストと依存関係のモックに問題があります。void メソッドで副作用が観察され、動作も観察される可能性があることは理解していますが、これらのガイドラインをこのコードに適用するのは困難です。同様の質問がありますが、その後のローカルな状態の変更を扱うものは見つかりませんでした。私はJUnitとMockitoを使用しています...これは、私が話しているコードの不自然なバージョンです:

@Mock
MergingObject mergingObject;

@Override
public void process(Foo foo1) {
    Foo foo2 = getAnInstanceOfFoo(); // private
    Foo foo3 = mergingObject.merge(foo1, foo2); // public
    foo1.copySomeValues(foo3);
}

ここでの難問は、MergingObject オブジェクトのモックを作成するかどうかです。merge(...) 操作が呼び出されないため、オブジェクトをモックすると、期待される状態の変化は消えます。merge(...) が foo1 と foo2 の正しいインスタンスで呼び出されたことを確認することはできますが、その後の copySomeValues(...) 呼び出しは引き続き NullPointerException をスローします。

助言がありますか?

4

2 に答える 2

3

誤解しない限り、mergingObject をモックとして設定していますが、モックの動作を設定していません。モックされたmergingObjectに、.mergeが呼び出されたときに何かを返すことを伝える必要があります。その何かは好きなものであり、process() から返されたオブジェクトが同じオブジェクトであることを確認できます。

mockito でスタブ構文を使用して動作を設定できます。私はmockitoを使ったことはありませんが、サイトを見るとこのようなものです

when(mergingObject.merge(something, somethingelse).return(new Foo());

foo1 と foo2 に一致するように、something と何かの引数を指定する方法に注意する必要があります。

于 2013-02-21T15:50:18.467 に答える
0

あなたが投稿したものから私が気付いたのは、あなたが何をテストしているのか、そしてその理由がはっきりしていないということです。

与えられたMergeは、独自のテストセットを持つ別のクラスに委任されています。CopySomeValuesをテストするためにfoo1とfoo3を作成しました。マージはまったく機能しません。

于 2013-02-21T21:21:09.743 に答える