2017-06-05 67 views
0

我想創建存根的集合,以便在我調用getId()方法時返回0,第二個Item.getId()返回1等等。 getId()方法的值必須等於元素的索引。我嘗試這個用mockito創建存根的集合

@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

你需要做的是模擬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); 
} 
+0

很抱歉,爲什麼RETURNS_DEEP_STUBS在這種情況下無法工作?我認爲它必須模擬get(int)方法,然後模擬getId()方法,否則我無法正確理解RETURNS_DEEP_STUBS。 – user3610700

+0

無論您發送哪個參數,RETURNS_DEEP_STUBS可以做的是返回相同的對象。因此,您需要一種方法來指定您希望根據參數返回不同的對象。 – alayor

+0

感謝您的細化 – user3610700

0

這裏:

@Mock(answer = Answers.RETURNS_DEEP_STUBS) 
private List<Item> items; 

簡單:錯。你從來沒有模擬一個很容易用真正的代碼創建的類。

您可以簡單地創建一個普通的ArrayList(或任何其他實現List的東西)並用模擬的答案對象填充;配置爲返回預期值。

事情是:你使用嘲笑儘可能少。這是一個很好又方便的幫手,但是如果你沒有它就可以走了(如上所述;這裏非常容易);你根本就不這樣做。