一部だけを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:
...