mockito ArrayList <String>问题

Sar*_*ica 29 java unit-testing arraylist mocking mockito

我有一个方法,我试图进行单元测试.此方法将参数作为ArrayList并使用它执行操作.我试图定义的模拟是:

ArrayList<String> mocked = mock(ArrayList.class);
Run Code Online (Sandbox Code Playgroud)

这给出了[未经检查]未经检查的转换"警告.

ArrayList<String> mocked = mock(ArrayList<String>.class);
Run Code Online (Sandbox Code Playgroud)

给了我一个错误.

任何人都想关心我做错了什么?

Ste*_*e N 57

另一种方法是使用@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);
  }
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*yak 25

ArrayList<String>.class 是Java编译器不支持的构造.

首先尝试,你应该这样做:

@SuppressWarnings( "unchecked" )
ArrayList<String> mocked = mock(ArrayList.class);
Run Code Online (Sandbox Code Playgroud)

这是因为mock方法只能返回原始类型.通常,使用原始类型并不好,因为这可能会导致运行时错误.在你的情况下,它是完美的,因为你知道这mocked不是一个真实ArrayList<String>的.

只是关于@SuppressWarnings( "unchecked" )注释的一般建议.尽量使其尽可能接近问题的根源.例如,您可以将其仅用于变量声明,或者可以为整个方法禁止它.通常会对变量进行抑制,因为否则广义方法注释可以抑制函数中的其他问题.

  • 作为旁注,这个特殊问题在Effective Java,Second Edition的第24项(第116-118页)中讨论.整个Generics章节在Sun的网站上以PDF格式提供:http://java.sun.com/docs/books/effective/generics.pdf (3认同)