Java 单元测试循环被多次执行
由于某种原因,在单元测试中执行的方法内部的循环会多次执行。正因为如此,我得到了Java 单元测试循环被多次执行,java,unit-testing,Java,Unit Testing,由于某种原因,在单元测试中执行的方法内部的循环会多次执行。正因为如此,我得到了ConcurrentModificationException。简而言之,方法通过对象循环,对每个对象执行另一个方法,并使用Runnable参数。在部署应用程序时,这种方法工作得很好,但在单元测试期间,循环执行了不止一次,我得到了一个错误 代码示例: @RunWith(JukitoRunner.class) public class MyTest { @Inject MainService mainS
ConcurrentModificationException
。简而言之,方法通过对象循环,对每个对象执行另一个方法,并使用Runnable
参数。在部署应用程序时,这种方法工作得很好,但在单元测试期间,循环执行了不止一次,我得到了一个错误
代码示例:
@RunWith(JukitoRunner.class)
public class MyTest {
@Inject
MainService mainService;
@Test
public void testMain(){
mainService.setData(mainService.getSelectedData());
}
}
public class MainService {
List<Data> data = new ArrayList<Data>();
List<Field> fields = new ArrayList<Field>();
public MainService(){
/* this.fields is filled here*/
data.add(/*data obj*/);
data.add(/*data obj*/);
data.add(/*data obj*/);
}
public List<Data> getSelectedData(){
/* alghoritm to filter data */
return data; /*returns List with 1 and 2nd data objects from this.data*/
}
private void deleteEl(Field field, Runnable callback){
fields.remove(field);
for (ListIterator<Data> i = data.listIterator(); i.hasNext();) {
Data data = i.next();
if(data.something()) i.remove();
}
if (callback != null) {
callback.run();
}
}
public void setData(List<Data> selected){
for(Field field : fields){// checked with debug, this gets executed more than once, why?! It should run only once. ConcurrentModificationException gets thrown here.
if(field instanceof Object){
deleteEl(field, new Runnable(){
@Override
public void run(){
create(selected); //won't post create() code, since even commenting this, does not help. Error persists
}
})
}
}
}
}
@RunWith(JukitoRunner.class)
公共类MyTest{
@注入
主服务主服务;
@试验
公共void testMain(){
mainService.setData(mainService.getSelectedData());
}
}
公共类主服务{
列表数据=新的ArrayList();
列表字段=新的ArrayList();
公共服务(){
/*此字段在此处填充*/
数据。添加(/*数据对象*/);
数据。添加(/*数据对象*/);
数据。添加(/*数据对象*/);
}
公共列表getSelectedData(){
/*alghoritm用于过滤数据*/
返回数据;/*从该.data返回包含1个和第2个数据对象的列表*/
}
私有void deleteEl(字段,可运行回调){
字段。删除(字段);
for(ListIterator i=data.ListIterator();i.hasNext();){
数据=i.next();
if(data.something())i.remove();
}
if(回调!=null){
callback.run();
}
}
公共无效设置数据(选定列表){
对于(Field-Field:fields){//debug检查过,它会执行多次,为什么?!它应该只运行一次。ConcurrentModificationException会在这里抛出。
if(对象的字段实例){
deleteEl(字段,new Runnable(){
@凌驾
公开募捐{
create(selected);//不会发布create()代码,因为即使对此进行注释也没有帮助。错误仍然存在
}
})
}
}
}
}
发生异常是因为您在迭代字段列表(for(field-field:fields)
时从字段列表中删除了一个字段(deleteEl
方法的第一行)
顺便说一句,我假设对
(对象的字段实例)
的检查总是返回true。发生异常的原因是,在迭代字段列表(for(字段:字段)
时,从字段
列表(方法的第一行)中删除字段
顺便说一句,我假设检查
(对象的字段instanceof)
始终返回true。不,它不是重复的。您是否尝试过逐步调试它和/或设置断点以检查可能的原因?抛出了什么错误?为什么会出现没有断言的测试用例?您在遍历字段时删除了它。这是一个与测试无关的错误。setData
通过字段
,调用deleteEl
deleteEl
调用字段。删除(字段)
。你不能这样做。我只是发布了测试的基本内容,只有导致测试的部分,因此没有断言……不,它不是重复的。你是否尝试过一步一步地调试它和/或设置断点来检查可能的原因?抛出了什么错误?为什么没有断言的测试用例?你在迭代t时删除了它hr通过字段
。这是一个与测试无关的错误。setData
迭代字段
,并调用deleteEl
调用字段。删除(字段)
。你不能这样做。我只是发布了测试的基本内容,只有原因部分,因此没有断言……如果field
为null,那么field instanceof Object
将返回false。因此我想这是一个复杂的null检查……aggreed,显式检查field!=null
将更容易理解>顺便说一句,我假设检查(对象的字段instanceof)总是返回true。
错误的假设。无论如何,问题与@nbrooks注释有关,尽管它有点复杂,但我不明白,它可能是字段
,或者字段的子类型
或者null
…所以为什么不改为检查null呢?字段只是一个例子,它与手头的问题无关,所以我没有费心发布我的真实代码。事实上,字段将是一个基类,并且该类有几个不同的扩展,因此需要检查基类是否属于特定实例(显然不是lang.Object)。如果字段
为空,则对象的字段实例
将返回false。因此,我猜这是一个复杂的空检查…aggreed,显式检查字段!=null
将更容易理解顺便说一句。我假设检查(对象的字段实例)总是返回true。
错误的假设。无论如何,问题与@nbrooks注释有关,尽管它有点复杂,但我不明白,它可能是字段
,或者字段的子类型
或者null
…所以为什么不改为检查null呢?字段只是一个例子,它与手头的问题无关,所以我没有费心发布我的真实代码。事实上,字段将是一个基类,并且该类有几个不同的扩展,因此需要检查基类是否是某个特定实例(显然不是lang.Object)。