[英]How to test equality for a sublist in java, Mockito
我有一個集合作為參數的方法:
call(Collection<String> strings);
我調用的方法如下:
myClass.call(list.sublist(1,n));
當我運行代碼時,一切都運行得很好。 但是,在使用Mockito進行測試時,我正在使用代碼段對其進行測試:
verify(myClass,times(1)).call(myList);
它反復拋出以下錯誤:
無法評估表達式拋出'java.util.ConcurrentModificationException'異常。
我猜這是因為它無法進行測試。 任何可以幫助的解決方法? 我想知道myList是否包含與傳遞的元素相同的元素。
使用@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)
或將您的數據結構切換為支持Guava庫等不可 return Collections.unmodifiableList(myList)
的數據結構
我得到了答案。 實際上,在整個函數運行后調用verify方法。
因此,即使myClass在調用時具有正確的子列表作為參數,當稍后修改列表時,子列表也會變為無效。
調用整個方法后調用Verify方法,因此驗證時要測試的子列表無效。
因此它拋出了這個例外。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.