web-dev-qa-db-ja.com

おそらくMockitoでvoidを返すメソッドをモック/テストする方法

問題に遭遇し、エレガントな解決策が見つかりません。

そのため、問題はSelenium Webドライバーのモックにあり、voidメソッドをどのようにテスト/モックすべきかわかりません。

public void clickAndWait(String locator) {
    if(isElementPresent(locator) == false) throw some exception;
    Selenium.clickAndWait(); //a problematic delegating call to Selenium
}

だから私が求めているのは、そのようなメソッドを適切にテストする方法です、1つのテストは例外がスローされることでしょうが、どのように適切にボイドメソッドのテストを委任しますか?

17
Jarek

この Mockitoドキュメント からの次のコードサンプルは、voidメソッドをモックする方法を示しています。

doThrow(new RuntimeException()).when(mockedList).clear();

// following throws RuntimeException:
mockedList.clear();
31
hoipolloi
doAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {

            return null;
        }
    }).when(mock).method((SomeClass) anyObject());
21

これまでの回答では、呼び出しごとに何かを実行する(おそらく例外をスローする)ことを強調していました。このように何かをするとき:

_doThrow(new RuntimeException()).when(mockedList).clear();
_

そして、次のようにスタブサービス(またはロジック)を呼び出します。

_mockedList.clear();
_

例外が生成されます。メソッドの適切な機能をテストする場合は、肯定的なテストケースを作成します。そのような場合のvoidを返すメソッドのモックは、次の方法で実行できます。

_doNothing().when(mockedList).clear();
_

つまり、mockedListモックのclear()メソッドをスタブ化したため、このメソッドがユニットのロジックに影響を与えないことを確認でき、残りの部分をチェックできます。例外を生成せずにフロー。

10
Sourabh

以下も使用できます。

  • メソッドが呼び出された回数を確認するメソッドMockito.verify(mock/spy)。
  • または、 argument captor を使用して、voidメソッドに渡されたいくつかのパラメーターを確認します。
1
jakcam

Java 8では、これを少しきれいにすることができます

doAnswer((i) -> {
  // Do stuff with i.getArguments() here
  return null;
}).when(*mock*).*method*(*methodArguments*);

return null;は重要です。これがないと、doAnswerの適切なオーバーライドを見つけることができないため、コンパイルがかなり不明瞭なエラーで失敗します。

0
Tim B

メソッド呼び出しで例外をスローできます。これを行う方法の小さな例を次に示します。

_doThrow(new RuntimeException()).when(mockedList).clear();
_

その後、mockedList.clear();を呼び出すと、モックされたメソッドが例外をスローします。

または、メソッドが呼び出された回数を数えることができます。これを行う簡単な例を次に示します。

_verify(mockedList, times(1)).clear(); 
_
0