代码之家  ›  专栏  ›  技术社区  ›  Sardathrion - against SE abuse

mockito arraylist<string>问题

  •  28
  • Sardathrion - against SE abuse  · 技术社区  · 14 年前

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

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

    这会发出[未选中]未选中的转换“警告。

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

    给我一个错误。

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

    2 回复  |  直到 10 年前
        1
  •  55
  •   Steve N    13 年前

    另一种方法是使用@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
  •  25
  •   Alexander Pogrebnyak    14 年前

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

    对于您第一次尝试,您应该这样做:

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

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

    只是一般性的建议 @SuppressWarnings( "unchecked" ) 注释。尽量使其接近问题的根源。例如,您可以将其仅用于变量声明,也可以对整个方法抑制它。一般来说,对变量抑制它,因为除此之外,广义方法注释可以抑制函数中的其他问题。