2010-05-27 70 views
26

我有一个方法,我试图单元测试。这个方法接受一个参数作为一个ArrayList,并用它做事情。我试图定义的模拟是:mockito ArrayList <String>问题

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

这给[选中]选中转换”的警告

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

给我一个错误

人照顾赐教为。我做错了什么?

回答

52

另一种方法是使用@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

谢谢。智能解决方案这有点不公平,它没有被标记为那样。 – pimpf0r 2013-11-11 10:41:13

+0

很好的回答,我最终使用了这种方法。 – 2015-07-31 20:01:26

+0

是的,没有看过这个年龄的问题...对不起。 – Sardathrion 2015-11-20 10:46:29

23

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

对于你先试试,你应该这样做:

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

这是因为mock方法只能返回原始类型。一般来说,使用原始类型并不好,因为这可能会导致运行时错误。在你的情况下,这很好,因为你知道mocked不是真的ArrayList<String>无论如何。

只是一个关于@SuppressWarnings("unchecked")注释的一般建议。尽量保持它尽可能接近问题的根源。例如,你可以把它放在变量声明中,或者你可以为整个方法压缩它。通常将其压缩为一个变量,否则宽泛的方法注释可以抑制函数中的其他问题。

+3

作为附带说明,这种特殊的问题是如第24项所讨论的(上页116-有效的Java,第二版的118)。整个泛型章节在Sun网站上以PDF形式提供:http://java.sun.com/docs/books/effective/generics.pdf – Powerlord 2010-05-27 15:22:11

+0

这很有道理。一般来说,我不喜欢忽略警告,但我不知道你可以忽略一行。谢谢。 – Sardathrion 2010-05-27 15:22:56