Mockito で本当に厄介な問題に遭遇しました。
コード:
public class Baz{
private Foo foo;
private List list;
public Baz(Foo foo){
this.foo = foo;
}
public void invokeBar(){
list = Arrays.asList(1,2,3);
foo.bar(list);
list.clear();
}
}
public class BazTest{
@Test
void testBarIsInvoked(){
Foo mockFoo = mock(Foo.class);
Baz baz = new Baz(mockFoo);
baz.invokeBar();
verify(mockFoo).bar(Arrays.asList(1,2,3));
}
}
これにより、次のようなエラー メッセージが表示されます。
Arguments are different! Wanted:
foo.bar([1,2,3]);
Actual invocation has different arguments:
foo.bar([]);
今何があったの:
Mockito レコードは のコピーではなくを参照するため、上記のコードでは、Mockito は呼び出し中に実際に渡されたバージョン ( ) ではなく、変更されたバージョン(空のリスト) に対して検証します!list
list
[]
[1,2,3]
質問:
以下のような防御的なコピーを行う以外に、この問題に対するエレガントでクリーンな解決策はありますか (これは実際には役立ちますが、この解決策は好きではありません)。
public void fun(){
list = Arrays.asList(1,2,3);
foo.bar(new ArrayList(list));
list.clear();
}
テストで技術的な問題を修正するためだけに、正しい製品コードを変更してそのパフォーマンスを低下させたくはありません。
Mockito でよくある問題と思われるため、ここでこの質問をしています。それとも、何か間違ったことをしただけですか?
PS。これは実際のコードではないので、リストを作成してからクリアする理由などを聞かないでください。実際のコードでは、似たようなことをする必要があります :-)。