質問
が可能ですか?
は単純な例では、私は私のユニットアンダーテストにモック工場(FooFactory)を供給し、Foo.create()が呼び出されたときに、それがユニットに特定の方法で使用する模擬(フー)を返します-under-テスト。私は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オブジェクトを返しますが、いないクラスのすべてのメソッドは、実際にリーダーを構築します。私は明らかに私はリーダーが必要とされている知っているすべてのテストに検証を追加することができますが、それは重複努力の多くのように思える。
解決
あなたがこのテストを書きたいことを確認してくださいあなたは?
私は2つのソリューションを見ることができます
1)あなたは本当にあなたが両方のメソッド呼び出しを確認することができますテストを、書いてみる、リソースが作成され、閉じられますことを確認する。
2)あなたは確かリソースが開かれるたびに、それはまた閉じていることを確認します。これは、生産コードでアサーションとして実装することができ...
あなたが本当にあなたのアプローチを進めて行きたい場合は、は、あなたが最初に作成した場合()メソッドが呼び出されていないスロー確認することを例外をキャッチすることができます。キャッチであなただけ返します。
また、あなたはクリーンアップで検証を行うが、実際の試験方法ではないはずです。
他のヒント
正直なところ、それが鳴ります。これは、ハンドル物事への最善の方法は、各テストは一つだけをテストすることを確実にするためであることを多くのプロジェクトやユニットテストの多くの私の経験をされています。あなたが好きなように多くの人が主張するようあなたは持つことができますが、それはと呼ばれ、1つのシナリオがテストされている一つの方法でなければなりません。何かのMOとテストがあまりにも複雑になります。さらにアプリを開発する際、他の開発者が、後の段階でテストをピックアップするためにプラス、それは非常に難しいことになります。
私は、複数のテストにシナリオごとに1つずつテストを壊す示唆して、あなたはまだこれを必要とするかどうかを確認したいので。