如何测试 java 中子列表的相等性,Mockito
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);
它反复抛出以下错误:
Unable to evaluate the expression Method threw 'java.util.ConcurrentModificationException' 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));
}
}
还要确保您的 collection 没有在其他线程中发生变化。如果您无法控制其他线程在做什么,那么您应该进行防御性编码并返回 return Collections.unmodifiableList(myList)
或将您的数据结构切换为支持 immutablility like Guava library
的数据结构
我得到了答案。实际上,verify方法是在整个函数有运行.
之后调用的
因此,即使 myClass 在调用时将正确的子列表作为参数,但稍后修改列表时,子列表将失效。
Verify方法是在调用整个方法之后调用的,所以验证时要测试的子列表是无效的。
因此它抛出了那个异常。
我有一个以集合作为参数的方法:
call(Collection<String> strings);
我调用方法如下:
myClass.call(list.sublist(1,n));
当我是运行代码时,一切都运行完美。 但是,在使用 Mockito 进行测试时,我正在使用代码片段对其进行测试:
verify(myClass,times(1)).call(myList);
它反复抛出以下错误:
Unable to evaluate the expression Method threw 'java.util.ConcurrentModificationException' 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));
}
}
还要确保您的 collection 没有在其他线程中发生变化。如果您无法控制其他线程在做什么,那么您应该进行防御性编码并返回 return Collections.unmodifiableList(myList)
或将您的数据结构切换为支持 immutablility like Guava library
我得到了答案。实际上,verify方法是在整个函数有运行.
之后调用的因此,即使 myClass 在调用时将正确的子列表作为参数,但稍后修改列表时,子列表将失效。
Verify方法是在调用整个方法之后调用的,所以验证时要测试的子列表是无效的。
因此它抛出了那个异常。