使用mockito创建存根集合

时间:2017-06-05 15:59:49

标签: java mockito

我想创建存根集合,这样当我调用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

我如何完成这项任务?

2 个答案:

答案 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 。这是一个友好而方便的帮手,但是当你没有它时(如上所述;这在这里非常容易);你根本就不去做。