我有一种包含集合作为参数的方法:
call(Collection<String> strings);
我称之为以下方法:
myClass.call(list.sublist(1,n));
当我运行代码时,一切都完美地运行。但是,在使用Mockito进行测试时,我正在使用代码片段进行测试:
verify(myClass,times(1)).call(myList);
它反复提出以下错误:
无法评估表达方法投掷'java.util.concurrentmodification exception'异常。
我猜这是因为它无法进行测试。有能力有帮助的解决方法吗?我想检查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 Library
我得到了答案。实际上,在整个函数运行后调用验证方法。
因此,即使MyClass称为正确的sublist作为一个参数,在稍后修改列表时,sublist也会变得无效。
验证方法是在调用整个方法后调用的,因此在验证时要测试的sublist无效。
因此,这是一个例外。