Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单元测试循环被多次执行_Java_Unit Testing - Fatal编程技术网

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)。