ExceptionThrowMethodというメソッドを呼び出す箇所を何もしないでスキップさせたいと考えております。
ExceptionThrowMethodにはStringとString配列を渡す仕様になっています。
そこで以下の様なコードを書いたのですが、String配列が同一でない為かモック用メソッドが動いてくれません。
Mockito.doNothing().when(spyObj).ExceptionThrowMethod("E001", new String[]{"hoge1", "hoge2"}); ・・・①
仕方ないので以下の様なテストコードを書くと実行時エラーとなります。
Mockito.doNothing().when(spyObj).ExceptionThrowMethod("E001", (String[]) anyObject()); ・・・②
そこで以下の様に書き換えるとエラーになりませんでした。
Mockito.doNothing().when(spyObj).ExceptionThrowMethod(anyString(), (String[]) anyObject()); ・・・③
質問としては、以下の通りです。
1.anyを使う際は②の様な中途半端に使うとエラーが起きる。
その為、③の様に全てをanyに置き換えないといけないのでしょうか?
2.①の様に値事態は分っているのにうまく動いてくれません。
何か別の書き方はありますでしょうか?
もしくは実行後のverifyメソッドをどの様に記述すれば上のコードを検証できますでしょうか?
①の書き方でも問題ありません。
ExceptionThrowMethodのメソッド引数の定義に問題がありそうです。
オーバーロードされたメソッドがあるとか。
②の書き方は許可されていないようです。
③のように引数をanyとするには全てをanyにしないと正しい判断ができないのでしょう。
なお、 (String) any()とキャストするよりは、下記コードのように any(String.class) と型を指定する方が綺麗かな?
package jp.classmethod.mockito.examples; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doNothing; import org.junit.Test; import org.mockito.Mockito; public class DoNothing { @Test public void doNothingの利用例() throws Exception { TestTarget obj = new TestTarget(); TestTarget spy = Mockito.spy(obj); doNothing().when(spy).throwException(any(String.class), any(String[].class)); // doNothing().when(spy).throwException(any(String.class), any(String[].class)); // Testing spy.throwException("hello", new String[] {"Java", "World"}); } public static class TestTarget { public void throwException(String param, String[] params) { throw new RuntimeException(); } } }
これでどうでしょう。
Mockito.doNothing().when(spyObj).ExceptionThrowMethod(anySet);
ご回答ありがとうございます。
ただ、このコードではコンパイルエラーになると思いますが…。
後、③の簡略化を行いたい訳ではなく、②もしくは①の様にできるだけanyを使わずにExceptionThrowMethod(String, String[])をモック化したメソッドを呼び出す様にしたいです。
①の書き方でも問題ありません。
ExceptionThrowMethodのメソッド引数の定義に問題がありそうです。
オーバーロードされたメソッドがあるとか。
②の書き方は許可されていないようです。
③のように引数をanyとするには全てをanyにしないと正しい判断ができないのでしょう。
なお、 (String) any()とキャストするよりは、下記コードのように any(String.class) と型を指定する方が綺麗かな?
package jp.classmethod.mockito.examples; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doNothing; import org.junit.Test; import org.mockito.Mockito; public class DoNothing { @Test public void doNothingの利用例() throws Exception { TestTarget obj = new TestTarget(); TestTarget spy = Mockito.spy(obj); doNothing().when(spy).throwException(any(String.class), any(String[].class)); // doNothing().when(spy).throwException(any(String.class), any(String[].class)); // Testing spy.throwException("hello", new String[] {"Java", "World"}); } public static class TestTarget { public void throwException(String param, String[] params) { throw new RuntimeException(); } } }
ご回答ありがとうございます。
①の明確な回答ありがとうございます。
当記載頂いたことより再度確認した結果、一部のパターンで値をすり替えている箇所があった様でそのためにスタブロジックが動いておりませんでした。
非常に助かりました。ありがとうございます。
また、③のご指摘ありがとうございます。
anyObjectというのがあったので、その様な使い方をするもんだと思っていたのですが、こちらの方が確かに綺麗ですね。今後のコーディングに役立てます。
ご回答ありがとうございます。
2014/03/22 11:43:31①の明確な回答ありがとうございます。
当記載頂いたことより再度確認した結果、一部のパターンで値をすり替えている箇所があった様でそのためにスタブロジックが動いておりませんでした。
非常に助かりました。ありがとうございます。
また、③のご指摘ありがとうございます。
anyObjectというのがあったので、その様な使い方をするもんだと思っていたのですが、こちらの方が確かに綺麗ですね。今後のコーディングに役立てます。