Mockito - 如何使用列表匹配器限制列表类型?

时间:2016-08-02 11:12:36

标签: java unit-testing junit mocking mockito

我有以下界面:

public interface ListHandler {

    public boolean add(List<?> list, Object element);

}

我想在测试中确保它只接收具有某种类型的列表,例如String。我编写了以下测试代码:

@Test
public void testAddOnlyString() {
    boolean actual = false;

    when(this.listHandlerMock.add(
        Matchers.anyListOf(String.class),
        Matchers.anyString()
    )).thenReturn(true);

    actual = this.listHandlerMock.add(new ArrayList<Integer>(), 1);
    assertTrue(actual);

    verify(this.listHandlerMock).add(
        Matchers.anyListOf(String.class),
        Matchers.anyString()
    );
}

但测试通过正确。

1 个答案:

答案 0 :(得分:2)

简短回答:你不能。列表的类型在编译时清除(类型擦除) 例如,这将打印true

System.out.println(new ArrayList<Integer>().equals(new ArrayList<String>()));

同样来自Matchers.anyListOf的文档:

  

这种方法不进行任何类型检查,只是为了避免   铸造你的代码。

如果列表不为空,您可以构建一个匹配器来检查每个条目是否具有您期望的类型,但对于空列表,您无法执行任何操作。