問題に遭遇し、エレガントな解決策が見つかりません。
そのため、問題はSelenium Webドライバーのモックにあり、voidメソッドをどのようにテスト/モックすべきかわかりません。
public void clickAndWait(String locator) {
if(isElementPresent(locator) == false) throw some exception;
Selenium.clickAndWait(); //a problematic delegating call to Selenium
}
だから私が求めているのは、そのようなメソッドを適切にテストする方法です、1つのテストは例外がスローされることでしょうが、どのように適切にボイドメソッドのテストを委任しますか?
この Mockitoドキュメント からの次のコードサンプルは、voidメソッドをモックする方法を示しています。
doThrow(new RuntimeException()).when(mockedList).clear();
// following throws RuntimeException:
mockedList.clear();
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
return null;
}
}).when(mock).method((SomeClass) anyObject());
これまでの回答では、呼び出しごとに何かを実行する(おそらく例外をスローする)ことを強調していました。このように何かをするとき:
_doThrow(new RuntimeException()).when(mockedList).clear();
_
そして、次のようにスタブサービス(またはロジック)を呼び出します。
_mockedList.clear();
_
例外が生成されます。メソッドの適切な機能をテストする場合は、肯定的なテストケースを作成します。そのような場合のvoidを返すメソッドのモックは、次の方法で実行できます。
_doNothing().when(mockedList).clear();
_
つまり、mockedList
モックのclear()
メソッドをスタブ化したため、このメソッドがユニットのロジックに影響を与えないことを確認でき、残りの部分をチェックできます。例外を生成せずにフロー。
以下も使用できます。
Java 8では、これを少しきれいにすることができます
doAnswer((i) -> {
// Do stuff with i.getArguments() here
return null;
}).when(*mock*).*method*(*methodArguments*);
return null;
は重要です。これがないと、doAnswer
の適切なオーバーライドを見つけることができないため、コンパイルがかなり不明瞭なエラーで失敗します。
メソッド呼び出しで例外をスローできます。これを行う方法の小さな例を次に示します。
_doThrow(new RuntimeException()).when(mockedList).clear();
_
その後、mockedList.clear();
を呼び出すと、モックされたメソッドが例外をスローします。
または、メソッドが呼び出された回数を数えることができます。これを行う簡単な例を次に示します。
_verify(mockedList, times(1)).clear();
_