人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

mockitoとJUnitを使ってテストを行っています。
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メソッドをどの様に記述すれば上のコードを検証できますでしょうか?

●質問者: riceflow
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● snow0214
●1ポイント

これでどうでしょう。

Mockito.doNothing().when(spyObj).ExceptionThrowMethod(anySet);

riceflowさんのコメント
ご回答ありがとうございます。 ただ、このコードではコンパイルエラーになると思いますが…。 後、?の簡略化を行いたい訳ではなく、?もしくは?の様にできるだけanyを使わずにExceptionThrowMethod(String, String[])をモック化したメソッドを呼び出す様にしたいです。

2 ● shuji_w6e
●199ポイント ベストアンサー

?の書き方でも問題ありません。
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();
 }
 }
}

riceflowさんのコメント
ご回答ありがとうございます。 ?の明確な回答ありがとうございます。 当記載頂いたことより再度確認した結果、一部のパターンで値をすり替えている箇所があった様でそのためにスタブロジックが動いておりませんでした。 非常に助かりました。ありがとうございます。 また、?のご指摘ありがとうございます。 anyObjectというのがあったので、その様な使い方をするもんだと思っていたのですが、こちらの方が確かに綺麗ですね。今後のコーディングに役立てます。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ