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メソッドをどの様に記述すれば上のコードを検証できますでしょうか?

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/03/21 12:24:30
  • 終了:2014/03/22 11:44:15

ベストアンサー

id:shuji_w6e No.2

shuji_w6e回答回数1ベストアンサー獲得回数12014/03/21 18:48:44

ポイント199pt

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

ご回答ありがとうございます。

①の明確な回答ありがとうございます。
当記載頂いたことより再度確認した結果、一部のパターンで値をすり替えている箇所があった様でそのためにスタブロジックが動いておりませんでした。
非常に助かりました。ありがとうございます。

また、③のご指摘ありがとうございます。
anyObjectというのがあったので、その様な使い方をするもんだと思っていたのですが、こちらの方が確かに綺麗ですね。今後のコーディングに役立てます。

2014/03/22 11:43:31

その他の回答(1件)

id:snow0214 No.1

snow0214回答回数470ベストアンサー獲得回数1162014/03/21 14:05:03

ポイント1pt

これでどうでしょう。

Mockito.doNothing().when(spyObj).ExceptionThrowMethod(anySet);
id:yoneyore

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

2014/03/21 16:15:48
id:shuji_w6e No.2

shuji_w6e回答回数1ベストアンサー獲得回数12014/03/21 18:48:44ここでベストアンサー

ポイント199pt

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

ご回答ありがとうございます。

①の明確な回答ありがとうございます。
当記載頂いたことより再度確認した結果、一部のパターンで値をすり替えている箇所があった様でそのためにスタブロジックが動いておりませんでした。
非常に助かりました。ありがとうございます。

また、③のご指摘ありがとうございます。
anyObjectというのがあったので、その様な使い方をするもんだと思っていたのですが、こちらの方が確かに綺麗ですね。今後のコーディングに役立てます。

2014/03/22 11:43:31

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません