4

メソッドがあります-テストしたいクラス(クラスA)のgetSomethingAmount()。この getSomethingAmount() メソッドのロジックは、クラス A の初期化時にコンストラクターに渡される Set bSet に依存します。たとえば、Set bSet に Status.OK の 2 つのオブジェクトが含まれている場合、getSomethingAmount() は 2 を返す必要があります。この状態を Mockito で正しく確認するにはどうすればよいですか?

ここで、2 つの B クラス型オブジェクトをスタブし、それらを bSet に入れ、JUnit アサーションで getSomethingAmount() メソッドの結果をアサートします。動作しますが、「真の」Mockito のようには見えません。

4

2 に答える 2

1

予想される動作の説明から、メソッドを単体テストするのはかなり確実な方法のように思えます。「本当のモッキートの方法」では、あなたが望むものは次のようなものだと思います。

Set mockBSet = mock(Set.class);
stub(mockBSet.size()).toReturn(2);
A testObjectA = new A(mockBSet);
Assert.assertEquals(testObjectA.getSomethingAmount(), 2);

これは、Setオブジェクトとtestオブジェクトの初期化には、テストで考慮したい副作用がないことを前提としています。(たとえば、常にデフォルトの「何か」を追加します。)この場合、スタブを省略して、テスト対象のメソッドがセットのサイズに等しい値を返すことを表明することもできます。

于 2011-06-27T08:35:31.123 に答える
1

コレクションではなく、コレクション内のオブジェクトをモックします。そうしないと、実装を変更した場合にテストが壊れやすくなり、壊れてしまいます。たとえば、sizeメソッドを使用するだけでなく、セット内のオブジェクトをループする必要があると判断した場合です。

B b = mock(B.class);
A target = new A(new HashSet<B>(Arrays.asList(b, b)));
Assert.assertSame(2, target.getSomethingAmount());
于 2011-09-16T22:04:46.503 に答える