2015-02-11 18 views
10

Bu, karanlıkta bir çekim.java.util.ConcurrentModificationException

java.util.ConcurrentModificationException 
    at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:966) 
    at java.util.LinkedList$ListItr.next(LinkedList.java:888) 
    at org.robolectric.shadows.ShadowResources.getOverlayedThemeValue(ShadowResources.java:294) 
    at org.robolectric.shadows.ShadowResources.findAttributeValue(ShadowResources.java:284) 
    at org.robolectric.shadows.ShadowResources.attrsToTypedArray(ShadowResources.java:187) 
    at org.robolectric.shadows.ShadowResources.access$000(ShadowResources.java:51) 
    at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:489) 
    at android.content.res.Resources$Theme.obtainStyledAttributes(Resources.java) 
    at android.content.Context.obtainStyledAttributes(Context.java:416) 
    at android.view.View.__constructor__(View.java:3317) 
    at org.robolectric.util.ReflectionHelpers$3.run(ReflectionHelpers.java:144) 
    at org.robolectric.util.ReflectionHelpers.traverseClassHierarchy(ReflectionHelpers.java:241) 
    at org.robolectric.util.ReflectionHelpers.callInstanceMethod(ReflectionHelpers.java:138) 
    at org.robolectric.internal.Shadow.invokeConstructor(Shadow.java:73) 
    at org.robolectric.shadows.ShadowView.__constructor__(ShadowView.java:109) 
    at android.view.View.<init>(View.java) 
    at android.widget.TextView.<init>(TextView.java) 
    at com.getbase.floatingactionbutton.FloatingActionsMenu.createLabels(FloatingActionsMenu.java:461) 
    at com.getbase.floatingactionbutton.FloatingActionsMenu.onFinishInflate(FloatingActionsMenu.java:447) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:763) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 
    at android.support.v7.app.ActionBarActivityDelegateBase.setContentView(ActionBarActivityDelegateBase.java:228) 
    at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:102) 
    at com.myapp.app.view.activity.MainActivityActivity.onCreate(MainActivityActivity.java:75) 
    at android.app.Activity.performCreate(Activity.java:5133) 
    at org.robolectric.util.ReflectionHelpers$3.run(ReflectionHelpers.java:144) 
    at org.robolectric.util.ReflectionHelpers.traverseClassHierarchy(ReflectionHelpers.java:241) 
    at org.robolectric.util.ReflectionHelpers.callInstanceMethod(ReflectionHelpers.java:138) 
    at org.robolectric.util.ActivityController$1.run(ActivityController.java:114) 
    at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:309) 
    at org.robolectric.shadows.CoreShadowsAdapter$2.runPaused(CoreShadowsAdapter.java:47) 
    at org.robolectric.util.ActivityController.create(ActivityController.java:110) 
    at com.myapp.app.BaseActivityRobolectricTest.startActivity(BaseActivityRobolectricTest.java:58) 
    at com.myapp.app.BaseActivityRobolectricTest.startActivity(BaseActivityRobolectricTest.java:34) 
    at com.myapp.app.view.activity.MainActivityActivityTest.setupActivity(MainActivityActivityTest.java:52) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:234) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:167) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:69) 
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:48) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) 
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) 
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) 
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:105) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360) 
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

Bu stacktrace ışık verme korkunç anlar yaşıyorum ve bittiğini ne olabilir: my robolectric birim test paketi çalıştırırken ben bazen aşağıdaki hatayı alıyorum. Bu işe giren ve bir çözüm bulmuş olan var mı?

Robolectric'in github'sinde, testleri gerçekleştirmeden önce clean yapmayı öneren bir sorun buldum. Bu testin başarısız olduğu sayıyı en aza indirgemeye devam etse de, yine de zaman zaman başarısız oluyor.

MainActivityActivity.java:75 olduğunu setContentView(R.layout.activity_main);

testi:

@Before 
public void setupActivity() { 
    setupAuthObjectGraphWithFakeData(); 
    startActivity(RequestReviewsActivity.class, new ParentModule(), null); 
} 

protected void startActivity(Class<T> activityClass, Object module, Intent intent) { 
    mActivityController = buildActivity(activityClass); 

    if(intent != null) { 
     mActivityController.withIntent(intent); 
    } 

    mActivity = mActivityController.get(); 

    List<Object> modules = new ArrayList<>(); 
    modules.addAll(mActivity.getModules()); 
    modules.add(module); 

    ObjectGraph objectGraph; 
    if(mActivity instanceof AuthedActivity) { 
     objectGraph = BaseApplication.getInstance().getAuthObjectGraph().plus(modules.toArray()); 
    } else { 
     objectGraph = BaseApplication.getInstance().getAppObjectGraph().plus(modules.toArray()); 
    } 
    mActivity.setObjectGraph(objectGraph); 

    mActivityController.create(mBundle).start().resume(); 
} 

@Test 
public void testViewsAreAvailable() { 
    assertThat(getActivity().mToolbar).isNotNull(); 
    assertThat(getActivity().mContent).isNotNull(); 
    assertThat(getActivity().mContentShadow).isNotNull(); 
    assertThat(getActivity().mRequestRootFab).isNotNull(); 
    assertThat(getActivity().mRequestReviewsList).isNotNull(); 
    assertThat(getActivity().mRequestReviewsMainContent).isNotNull(); 
} 

Güncelleme: (Aşağıdaki benzer) Etkinlik belirli birim testleri çalışmadığı zaman

Bu sorun ortadan kalkar . Şu an bu testleri yorumlamak zorunda kaldım.

Genelde burada bulunan Robolectric yaklaşımını takip ediyorum - http://blog.blundell-apps.com/android-gradle-app-with-robolectric-junit-tests/ bazı güncellemelerle (o makaleden biraz eski).

Eğer Fabric veya Crashlytics gibi bir şey kullanıyorsanız bir ./gradlew test

+1

Kodunuz nerede? –

+0

benim sorumu güncellendi, @KickButtowski – loeschg

+0

Bu çok ilginç :) Nasıl testler yapıyorsunuz? Herhangi bir şansa paralel mi? Benim için –

cevap

10

ile testleri çalıştırmak ediyorum, senin Robolectric testlerde devre dışı bırakmak için emin olun. , benzer bir soruna neden oluyor ve bazı yerel hata ayıklamalarından dolayı, soruna neden olan iş parçacığını bulduk. Kumaş başlatıldığında, bazı kaynaklara erişen bir arka plan iş parçacığı başlatır. Benim düşünceme göre bu, Robolectric ile ilgili bir hatadır, çünkü kaynak güvenli bir şekilde kaynak yüklemesini ele almaz, ancak Crashlytics'in bir birim test ortamına gerçekten ihtiyacı yoktur, bu yüzden bu hızlı bir çözümdür. Tipik olarak bir kullanıcı, Application sınıfında Fabric veya Crashlytics'i başlatacaktır. Robolectric, "Sınama" sözcüğü ile geçerli sınıfınızı önekleyerek "Test" Application sınıfını oluşturmanızı sağlar. Orijinal Application sınıfınızda, kilitlenme raporlama sistemini başlatmak için ayrı bir yöntem oluşturun. TestApplication'unuzda, bu yöntemi geçersiz kılın ve boş olduğundan emin olun, böylece Testlerinizde Fabric başlatılmamış olur. Örneğin:

App.java

public class App extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     setupCrashReporting(); 
    } 

    protected void setupCrashReporting() { 
     CrashlyticsCore core = new CrashlyticsCore.Builder() 
       .disabled(BuildConfig.DEBUG) 
       .build(); 

     Crashlytics crashlytics = new Crashlytics.Builder() 
       .core(core) 
       .build(); 

     Fabric.with(this, crashlytics); 
    } 
} 

TestApp.java

public class TestApp extends App { 
    @Override 
    protected void setupCrashReporting() { 
     // Do nothing. 
    } 
} 

Bu

bizim uygulamalardaki sorunu çözmek yardımcı oldu.

+2

Olduğuna sevindim * bizim * sorun çözüldü :) – loeschg

+0

Çözümü paylaştığınız için teşekkürler ama bu konuyla ilgili endişelerim Crashlytics birçok hata yapan büyük bir kuruluşta bulunuyorsanız Debug modunda çökmeleri yakalayamıyor. Hata ayıklama sürümünü kullanın, aksi halde sorun var demektir (test için sürüm sürümünü kullanıyorlarsa), bu harika bir fikir. – Hesam

+1

@Hesam, hata ayıklama yapılarında çalışmasını istiyorsanız, sadece .disabled (BuildConfig.DEBUG) satırını kaldırın ve sonra tüm yapıları etkinleştirin (TestApp sınıfına sahip olduğunuz sürece test hariç) hazır) – plackemacher