【问题标题】:mockito ArrayList<String> problemmockito ArrayList<String> 问题
【发布时间】:2011-02-24 17:24:00
【问题描述】:

我有一个方法,我正在尝试进行单元测试。此方法将参数作为 ArrayList 并对其进行处理。我试图定义的模拟是:

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

这会给出 [unchecked] unchecked conversion”警告。

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

给我一​​个错误。

有人愿意告诉我我做错了什么吗?

【问题讨论】:

    标签: java unit-testing arraylist mocking mockito


    【解决方案1】:

    替代方法是使用@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);
      }
    }
    

    【讨论】:

    • 谢谢。智能解决方案。这有点不公平,它没有被标记为那个。
    • 很好的答案,我最终使用了这种方法。
    • 是的,好久没看过这个问题了……抱歉。
    • 太棒了,这就是要走的路!
    【解决方案2】:

    ArrayList&lt;String&gt;.class 是 Java 编译器不支持的构造。

    如果你是第一次尝试,你应该这样做:

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

    这是因为mock 方法只能返回一个原始类型。一般来说,使用原始类型并不好,因为这可能会导致运行时错误。在您的情况下,这完全没问题,因为您知道 mocked 无论如何都不是真正的 ArrayList&lt;String&gt;

    只是关于@SuppressWarnings( "unchecked" ) 注释的一般建议。尽量让它靠近问题的根源。例如,您可以将其仅用于变量声明,或者您可以将其禁止用于整个方法。一般来说,为变量抑制它,否则广泛的方法注释会抑制函数中的其他问题。

    【讨论】:

    • 作为旁注,这个特殊问题在 Effective Java,第二版的第 24 条(第 116-118 页)中进行了讨论。 Sun 网站上提供了整个泛型章节的 PDF 格式:java.sun.com/docs/books/effective/generics.pdf
    • 这是有道理的。一般来说,我不喜欢忽略警告,但我不知道你可以只忽略一行。谢谢。
    猜你喜欢
    • 2012-10-19
    • 2016-01-20
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2017-08-30
    • 2015-12-07
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多