2017-08-09 16 views
0

何らかの理由で、ユニットテストで実行されるメソッド内部のループが何度か実行されます。そしてそのために私はConcurrentModificationExceptionを得る。これを短くするには、メソッドはオブジェクトをループし、各オブジェクトの他のメソッドをRunnableパラメータで実行します。これは、アプリケーションがデプロイされたときにうまく動作しますが、ユニットテスト中にループが複数回実行され、エラーが発生します。ユニットテストループが複数回実行される

コード例:フィールドのリストを反復処理しているときに(fieldsリスト(deleteElメソッドの最初の行)からfor(Field field : fields)をフィールドを削除するため

をところで

@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 
        } 
       }) 
      } 
     } 
    } 

} 
+0

いいえ、重複していません – CrazySabbath

+0

あなたはステップバイステップでデバッグしたり、ブレークポイントを設定して原因は?どのようなエラーがスローされますか?なぜアサーションのないテストケースがあるのですか? – PanBrambor

+1

'fields'を反復しながら削除します。これはテストに関係しないバグです。 –

答えて

2

例外が発生し、私が想定しています。 (field instanceof Object)のチェックは常にtrueを返します

+0

'field'がnullの場合、' field instanceof Object'はfalseを返します。だから私はここでは複雑なヌルチェックだと思います... – nbrooks

+0

'field!= null'のためのaggreed、明示的なチェックはもっとわかりやすいでしょう –

+0

' Btw。私は(field instanceof Object)のチェックが常にtrueを返すと仮定します。 '間違った仮定。とにかく、問題はもう少し複雑ですが、@nbrooksの注釈と関係があります。 – CrazySabbath

関連する問題