mockito ArrayList<String>问题

2022-09-01 11:17:28

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

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

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

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

给我一个错误。

有人想启发我,我做错了什么吗?


答案 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<String>.class是 Java 编译器不支持的构造。

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

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

发生这种情况是因为方法只能返回原始类型。通常,使用原始类型并不好,因为这可能会导致运行时错误。在你的情况下,这完全没问题,因为你知道那无论如何都不是真的。mockmockedArrayList<String>

只是关于注释的一般建议。尽量使其尽可能接近问题的根源。例如,您可以仅将其用于变量声明,也可以将其禁止用于整个方法。通常,对于变量,请抑制它,因为否则广泛的方法注释可能会抑制函数中的其他问题。@SuppressWarnings( "unchecked" )


推荐