質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

7439閲覧

Mockitoで可変引数にマッチさせたい

outso1990

総合スコア23

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

1クリップ

投稿2019/07/26 00:47

編集2019/07/26 00:49

Mockitoを利用したJUnitでの質問です。
オーバーロードしたメソッドで、可変引数と単一の引数を取るメソッドが混在する場合、
可変引数にマッチさせるにはどうしたらよいのでしょうか?

ネットで調べるとMockito.<Type>anyVararg()を使用するように書かれていたので、
その通りに実装してみても単一の引数を取るメソッドにマッチしてしまいます。
(anyVarargは非推奨になっていたのでArgumentMatchers.any(Type.class)やany**()など)

java

1public class MockTarget { 2 public String method(String arg) { 3 return "hoge"; 4 } 5 public String method(String... arg) { 6 return "hogehoge"; 7 } 8} 9 10@RunWith(MockitoJUnitRunner.class) 11public class Test { 12 @Mock 13 private MockTarget mockTarget; 14 15 @Test 16 public void test() { 17 Mockito.when(mockTarget.method(ArgumentMatchers.any(String.class))).thenReturn("fuga"); 18 // method(String arg)にマッチしてしまう 19 Mockito.when(mockTarget.method(ArgumentMatchers.anyString())).thenReturn("fuga"); 20 // method(String arg)にマッチしてしまう 21 Mockito.when(mockTarget.method(ArgumentMatchers.any(String[].class))).thenReturn("fuga"); 22 // String[]を渡しても"fuga"が返ってこない 23 } 24}

可変引数にマッチさせることはできないのでしょうか?

A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/26 08:01

そのソースでは public String method(String... arg) の場合 引数1個は 明示的に設定してるほうに行きますよ
outso1990

2019/07/26 08:03

引数が2個の場合に、モックメソッドを発動させるにはどう記述したらよいのでしょうか?
guest

回答1

0

ベストアンサー

単一のStringと可変長引数のStringが2つオーバーロードで実装されているメソッドに対し、
Mockito2の仕様で可変長配列はany()を使うようになりますが、「メソッドに対しあいまいです」とコンパイルエラーとなってしまいます。

これはMockito2の仕様のようなので、対応する方法としては、暫定として

java

1import static org.mockito.Mockito.*; 2import static org.junit.Assert.*; 3import static org.mockito.ArgumentMatcher.*; 4 5... 6 7when(sample.method(anyString(), anyString())).thenReturn("1");

など、複数の引数を必要なだけ定義して、モックの振る舞いを定義する方法で対処はできます。

もしモック対象のメソッド名が異なっている場合は(例えば otherMethod(String... var)の場合)

java

1when(sample.otherMethod(any(String[].class))).thenReturn("1");

で定義可能です。

ご参考まで。

投稿2019/08/04 07:10

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

outso1990

2019/08/20 00:28

やはり仕様でしたか。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問