web-dev-qa-db-ja.com

mockito ArrayList <String>の問題

単体テストをしようとしているメソッドがあります。このメソッドは、パラメーターをArrayListとして受け取り、それを処理します。私が定義しようとしているモックは:

ArrayList<String> mocked = mock(ArrayList.class);

[チェックされていない]チェックされていない変換」警告が表示されます。

ArrayList<String> mocked = mock(ArrayList<String>.class);

エラーが出ます。

誰かが私が間違っていることを教えてくれますか?

代わりに@Mockアノテーションを使用することで、Mockitoは型リフレクションを使用してジェネリック型を見つけることができます。

public class MyTest {

  @Mock
  private ArrayList<String> mockArrayList;

  ...

  public void setUp() {
    MockitoAnnotations.initMocks(this);
  }

  public void testMyTest() {
    when(mockArrayList.get(0)).thenReturn("Hello world");

    String result = mockArrayList.get(0);

    assertEquals("Should have the correct string", "Hello world", result);

    verify(mockArrayList).get(0);
  }
}
56
Steve N

_ArrayList<String>.class_は、Javaコンパイラではサポートされていない構成です。

あなたが最初に試す場合、これを行う必要があります:

_@SuppressWarnings( "unchecked" )
ArrayList<String> mocked = mock(ArrayList.class);
_

これは、mockメソッドが生の型のみを返すことができるために発生します。ランタイムエラーが発生する可能性があるため、一般にrawタイプを使用することはお勧めできません。あなたの場合、とにかくmockedがREAL _ArrayList<String>_ではないことを知っているので、それは完全に問題ありません。

@SuppressWarnings( "unchecked" )アノテーションに関する一般的なアドバイスです。問題の原因にできるだけ近づくようにしてください。たとえば、変数宣言のためだけに配置することも、メソッド全体に対して抑制することもできます。一般に、変数の場合は抑制します。それ以外の場合、広範なメソッドアノテーションは関数の他の問題を抑制できるためです。

25