我有一个方法,我正在尝试进行单元测试。此方法将参数作为ArrayList并使用它执行操作。我试图定义的模拟是:
ArrayList<String> mocked = mock(ArrayList.class);
提供[未经检查]未经检查的转化“警告。
ArrayList<String> mocked = mock(ArrayList<String>.class);
给了我一个错误。
任何人都想知道我做错了什么?
答案 0 :(得分:55)
另一种方法是使用@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);
}
}
答案 1 :(得分:25)
ArrayList<String>.class
是Java编译器不支持的构造。
首先尝试,你应该这样做:
@SuppressWarnings( "unchecked" )
ArrayList<String> mocked = mock(ArrayList.class);
这是因为mock
方法只能返回原始类型。通常,使用原始类型并不好,因为这可能会导致运行时错误。在你的情况下,它非常好,因为你知道mocked
不是真正的ArrayList<String>
。
只是关于@SuppressWarnings( "unchecked" )
注释的一般建议。尽量使其尽可能接近问题的根源。例如,您可以将其仅用于变量声明,或者可以为整个方法禁止它。通常会对变量进行抑制,因为否则广义方法注释可以抑制函数中的其他问题。