2

モックで、モックがテスト対象ユニットで実際に使用されたかどうかに基づいて、モックでメソッドが呼び出されたことを確認することは可能ですか?

簡単な例として、テスト対象のユニットにモックファクトリ(FooFactory)を指定し、Foo.create()を呼び出すと、テスト対象のユニットの特定のメソッドで使用されるモック(Foo)を返します。テスト。Foo.create()が被テストユニットによって呼び出された場合にのみ、Foo.method()が呼び出されることを確認するにはどうすればよいですか?

コードは次のようになると思います。

@Before
public void init() {
  Foo mockFoo = mock(Foo.class);
  when(fooFactory.create()).thenReturn(mockFoo);
  test = new UnitUnderTest(fooFactory);
}

@Test
... may or may not create a foo ...

@After
public void cleanup() {
  if (verify(fooFactory).create()) {  // Here's the 'conditional verification'
    Foo mockFoo = fooFactory.create();
    verify(mockFoo).close();
  }
}

もう少し具体的な例として、私のファクトリは閉じていることを確認したいReaderオブジェクトを返しますが、クラス内のすべてのメソッドが実際にReaderを構築するわけではありません。リーダーが必要であることがわかっているすべてのテストに検証を追加することはできますが、それは多くの重複した作業のようです。

4

2 に答える 2

1

このテストを作成してもよろしいですか?

私は2つの解決策を見ることができます:

1)リソースが作成されて閉じられることを本当に確認したいので、両方のメソッド呼び出しを検証できるテストを作成してみてください。

2)リソースが開かれるたびに、リソースも閉じられるようにする必要があります。これは、本番コードのアサーションとして実装できます...

本当にアプローチを進めたい場合は、create()メソッドが呼び出されていない場合に、最初の検証がスローされるという例外をキャッチできます。キャッチでは、あなたはただ戻るだけです。

また、クリーンアップではなく、実際のテスト方法で検証を行う必要があります。

于 2010-12-09T23:57:08.087 に答える
0

正直なところ、テストが複雑すぎるようです。多くのプロジェクトと多くの単体テストの私の経験では、物事を処理する最良の方法は、各テストが1つの物だけをテストすることを確認することです。必要な数のアサートを設定できますが、1つのメソッドを呼び出し、1つのシナリオをテストする必要があります。何でもmoとテストは複雑になりすぎます。さらに、他の開発者がアプリをさらに開発するときに、後の段階でテストを取得するのが非常に困難になります。

したがって、テストをシナリオごとに1つずつ、複数のテストに分割して、それでもこれが必要かどうかを確認することをお勧めします。

于 2010-12-10T00:52:23.030 に答える