我有一种方法,我正在尝试进行单元测试。此方法将参数作为 ArrayList 并对其进行处理。我试图定义的模拟是:
ArrayList<String> mocked = mock(ArrayList.class);
这给出了 [unchecked] 未经检查的转换”警告。
ArrayList<String> mocked = mock(ArrayList<String>.class);
给我一个错误。
有人愿意告诉我我做错了什么吗?
我有一种方法,我正在尝试进行单元测试。此方法将参数作为 ArrayList 并对其进行处理。我试图定义的模拟是:
ArrayList<String> mocked = mock(ArrayList.class);
这给出了 [unchecked] 未经检查的转换”警告。
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);
}
}
ArrayList<String>.class
是 Java 编译器不支持的构造。
对于您第一次尝试,您应该这样做:
@SuppressWarnings( "unchecked" )
ArrayList<String> mocked = mock(ArrayList.class);
发生这种情况是因为mock
方法只能返回原始类型。一般来说,使用原始类型并不好,因为这可能会导致运行时错误。在您的情况下,这完全没问题,因为您知道这无论如何mocked
都不是真实的。ArrayList<String>
只是关于@SuppressWarnings( "unchecked" )
注释的一般建议。尽量让它靠近问题的根源。例如,您可以将其仅用于变量声明,或者您可以将其禁止用于整个方法。通常为变量抑制它,因为否则广泛的方法注释可以抑制函数中的其他问题。