【发布时间】:2016-08-02 11:12:35
【问题描述】:
我有如下界面:
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()
);
}
但测试正确通过。
【问题讨论】:
-
由于泛型类型擦除,所以您在运行时不知道泛型类型。我猜
anyListOf匹配器所做的是检查列表中的所有元素是否属于这种类型,但由于列表为空,它永远不会失败。不管怎样,你知道你要通过什么清单——你为什么要在任何清单上断言?只需提取到list = new ArrayList<Integer>并期待相同的对象:sameInstance(list) -
顺便问一下,你的实物在哪里?测试所做的只是与模拟交互。你在这里测试什么?
标签: java unit-testing junit mocking mockito