我想创建存根集合,这样当我调用getId()方法时第一个Item返回0,第二个Item.getId()返回1,依此类推。 getId()方法的值必须与元素的索引相等。我试试这个
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private List<Item> items;
@Before
public void setUp() throws Exception {
initMocks(this);
}
@Test
public void mockCollection() throws Exception {
when(items.get(0).getId()).thenReturn(0);
when(items.get(1).getId()).thenReturn(1);
...
}
但是我得到了这个例外:
java.lang.ClassCastException: org.mockito.internal.creation.jmock.ClassImposterizer$ClassWithSuperclassToWorkAroundCglibBug$$EnhancerByMockitoWithCGLIB$$42aa7d0b cannot be cast to com.gubin.designpatterns.behavioural.observer.Item
我如何完成这项任务?
答案 0 :(得分:0)
您需要做的是模仿Item
。
@Mock
private Item item1;
@Mock
private Item item2;
@Test
public void mockCollection() throws Exception {
when(items.get(0)).thenReturn(item1);
when(items.get(1)).thenReturn(item2);
when(item1.getId()).thenReturn(1);
when(item2.getId()).thenReturn(2);
}
答案 1 :(得分:0)
下面:
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private List<Item> items;
简单地说:错了。您从不模拟使用实际代码轻松创建的类。
您可以简单地创建一个普通的ArrayList(或任何其他实现List的东西)并用模拟的答案对象填充它;配置为返回预期值。
事情是:你尽可能少地使用 mocking 。这是一个友好而方便的帮手,但是当你没有它时(如上所述;这在这里非常容易);你根本就不去做。