2017-02-27 46 views
1

我有了一個集合作爲參數的方法:如何測試平等在Java中的子表,的Mockito

call(Collection<String> strings); 

我打電話的方法如下:

myClass.call(list.sublist(1,n)); 

一切當我運行代碼時完美運行。

verify(myClass,times(1)).call(myList); 

更是多次拋出以下錯誤:

Unable to evaluate the expression Method threw 'java.util.ConcurrentModificationException' exception.

我猜測這是因爲它是無法施放 然而,隨着的Mockito測試時,我使用的代碼段測試它去測試。任何可以提供幫助的解決方法?我想檢查myList是否包含與傳遞的元素相同的元素。

+0

這個錯誤與鑄造無關。你能分享一個更完整的片段嗎?你沒有給我們太多的繼續。 – Mureinik

+0

這是我誠實的所有信息。 –

+0

我的意思是,我試着用參數匹配器進行調試,但調試器無法評估傳遞的對象。 –

回答

0

我得到了答案。實際上,在整個函數運行後調用驗證方法。

因此,即使myClass在調用時具有正確的子列表作爲參數,當列表稍後被修改時,子列表也將變爲無效。

驗證方法在整個方法被調用後調用,所以驗證時要測試的子列表無效。

因此它引發了這種異常。

0

使用@Captor並添加Hamcrest到項目,並做到這一點...

import org.hamcrest.Matchers.containsInAnyOrder; 

@RunWith(MockitoJUnitRunner.class) 
public class MyTest 
{ 
    MyClass myClass = new MyClass(); 

    @Captor private ArgumentCaptor<Collection<String>> collectionCaptor; 

    @Test 
    public void someTest() throws Exception 
    { 
     Collection<String> expectedCollection = Arrays.asList("a", "b", "c"); 

     // setup goes here 
     // execute test 

     Mockito.verify(myClass).call(collectionCaptor.capture()); 
     Collection<String> whatWasCaptured = collectionCaptor.getValue(); 
     assertThat(whatWasCaptured, Matchers.containsInAnyOrder(expectedCollection)); 
    } 
} 

另外,還要確保您的收藏中沒有其他線程變異。如果你無法控制其他線程正在做什麼,那麼你應該進行防禦性編碼,並返回return Collections.unmodifiableList(myList)或將您的數據結構切換爲支持的數據結構immutablility like Guava library

+0

這與問題中的工作方式相同。 –