我有以下界面:
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()
);
}
但测试通过正确。
答案 0 :(得分:2)
简短回答:你不能。列表的类型在编译时清除(类型擦除)
例如,这将打印true
:
System.out.println(new ArrayList<Integer>().equals(new ArrayList<String>()));
同样来自Matchers.anyListOf
的文档:
这种方法不进行任何类型检查,只是为了避免 铸造你的代码。
如果列表不为空,您可以构建一个匹配器来检查每个条目是否具有您期望的类型,但对于空列表,您无法执行任何操作。