一部だけをany系のメソッドにする方法
ArgumentMatchers
クラスのeq
メソッドを使うと、引数の値を指定できる。
public class AppTest {
@Test
public void tesFoo() {
App app = spy(new App());
doReturn("").when(app).foo(anyString(), eq(1)); // 1を指定したい場合は eq(1) にする
String result = app.foo("a", 1);
assertThat(result, is(""));
}
}
Mockitoでのモックメソッド
MockitoではdoReturn(戻り値).when(モックオブジェクト).メソッド名(引数)
でモックメソッドを作成する。
public class AppTest {
@Test
public void tesFoo() {
App app = spy(new App());
doReturn("").when(app).foo("a", 1); // fooに"a"と1を渡したときの戻り値を""にする
String result = app.foo("a", 1); // モックした引数("a", 1)を渡す
assertThat(result, is(""));
}
}
when(モックオブジェクト.メソッド名(引数)).thenReturn(戻り値)
でも同じことができる。
public class AppTest {
@Test
public void tesFoo() {
App app = spy(new App());
when(app.foo("a", 1)).thenReturn(""); // fooに"a"と1を渡したときの戻り値を""にする
String result = app.foo("a", 1); // モックした引数("a", 1)を渡す
assertThat(result, is(""));
}
}
引数の値を無制限にする
any()
を使うと引数の値を無制限にできる。
Stringの場合はanyString()
、intの場合はanyInt()
など基本的な型については用意されている。
public class AppTest {
@Test
public void tesFoo() {
App app = spy(new App());
doReturn("").when(app).foo(anyString(), anyInt()); // fooの引数を無制限にする
String result = app.foo("a", 1);
assertThat(result, is(""));
}
}
一部だけをany系のメソッドにできない
モックメソッドの引数のうち一部だけにany系のメソッドを渡した場合、InvalidUseOfMatchersException
が発生する。
public class AppTest {
@Test
public void tesFoo() {
App app = spy(new App());
doReturn("").when(app).foo(anyString(), 1); // 第一引数だけ anyString() にする
String result = app.foo("a", 1);
assertThat(result, is(""));
}
}
上記を実行すると以下のエラーが発生する。
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
2 matchers expected, 1 recorded:
...
\第一線のプログラマーの行動原理を学べる!/