Mockito 4 → 5 での可変長引数マッチの変更


Mockito 5 における可変長引数マッチ

可変長引数を受け取る count() メソッドがあった場合、

public class Foo {
    public int count(String... arguments) {
        return arguments.length;
    }
}

任意個数の引数(引数無しを含む)にマッチさせる場合は、以下のように配列クラスを指定する。

when(mock.count(any(String[].class)).thenReturn(0);

any() を指定した場合は、any() の個数に正確にマッチする。

when(mock.count()).thenReturn(0);             // 可変長引数 0個 に厳密にマッチ
when(mock.count(any())).thenReturn(1);        // 可変長引数 1個 に厳密にマッチ
when(mock.count(any(), any())).thenReturn(2); // 可変長引数 2個 に厳密にマッチ

以下の様に(配列クラスではなく)指定した場合も、可変長引数の個数に厳密にマッチする。

when(mock.count(any(String.class))).thenReturn(1); // 可変長引数 1個 に厳密にマッチ


Mockito 4 の場合

Mockito 4 では、可変長引数に any()1つ指定した場合、

when(mock.count(any())).thenReturn(1); 

以下の全てにマッチしていた。

mockedAnswer.count()
mockedAnswer.count("one")
mockedAnswer.count("one", "two")

any()1つでない場合は、コードの見た目通りにマッチする。

when(mock.count()).thenReturn(1);             // 可変長引数 0個 に厳密にマッチ
when(mock.count(any(), any())).thenReturn(1); // 可変長引数 2個 に厳密にマッチ


Mockito 4 → 5 へのマイグレーション

Mockito 4 → 5 へマイグレーションでは、以下のようなコードは、意図に応じて変更する必要がある。

when(mock.count(any())).thenReturn(1); 

ゼロを含む任意の可変長引数を許容する場合は以下のように変更する。

when(mock.count(any(String[].class))).thenReturn(1); 

可変長引数が正確に0個の場合にマッチさせる場合は以下のように変更する。

when(mock.count()).thenReturn(1); 

可変長引数が正確に1個の場合にマッチさせる場合は以下のように変更する。

when(mock.count(any())).thenReturn(1);