如何测试Java的Sublist,Mockito的平等



我有一种包含集合作为参数的方法:

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无效。

因此,这是一个例外。

相关内容

  • 没有找到相关文章

最新更新