Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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
JUnit测试中的java.util.ConcurrentModificationException_Java_Android_Junit_Robolectric - Fatal编程技术网

JUnit测试中的java.util.ConcurrentModificationException

JUnit测试中的java.util.ConcurrentModificationException,java,android,junit,robolectric,Java,Android,Junit,Robolectric,这张有点像是在黑暗中拍摄的。在运行robolectric单元测试套件时,我偶尔会遇到以下错误: java.util.ConcurrentModificationException at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:966) at java.util.LinkedList$ListItr.next(LinkedList.java:888) at org.robolectric.s

这张有点像是在黑暗中拍摄的。在运行robolectric单元测试套件时,我偶尔会遇到以下错误:

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)
更新:

当不运行特定于活动的单元测试时,这个问题就会消失(类似于以下内容)。目前,我不得不对这些测试进行注释

我通常遵循这里的机器人分子方法,并进行了一些更新(因为那篇文章有点旧)


我正在使用
/gradlew测试执行测试

如果您使用的是Fabric或Crashlytics之类的东西,请确保在您的机器人分子测试中禁用它。我们遇到了一个非常类似的问题,通过一些本地调试,我们能够找到导致该问题的线程。当结构初始化时,它会启动一个访问某些资源的后台线程。我的想法是,这主要是Robolectric的一个bug,因为它不以线程安全的方式处理资源加载,但在单元测试环境中确实不需要Crashlytics,所以这是一个快速修复方法

通常,用户将在其
应用程序
类中初始化结构或Crashlytics。Robolectric允许您通过在当前类前面加上单词“Test”来进行“Test”
应用程序
类。在原始的
应用程序
类中,创建一个单独的方法来初始化崩溃报告系统。在
测试应用程序中
,重写该方法并确保其为空,以便在测试中不会初始化结构。例如:

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.
    }
}

这有助于解决我们应用程序中的问题。

更新了我的问题@kickbutowskit这很有趣:)您如何运行测试?“这是平行的吗?”据我所知,我不是。我遵循这里的一般方法:。执行
/gradlew test
感谢您分享解决方案,但我担心的是,Crashlytics无法在调试模式下捕获崩溃,如果您所在的大公司中有许多使用调试版本的测试人员,那么您在其他方面就有问题(如果他们使用发布版本进行测试)那么这是一个很棒的主意。@Hesam如果你想让它在调试版本中工作,那么只需删除
.disabled(BuildConfig.debug)
行,然后它就可以在所有版本中启用(除了测试版本,只要你有
TestApp
类存在)。谢谢你,我在Crashlytics中遇到了一些错误,你的解决方案修复了这些错误,然而,我仍然有
java.util.ConcurrentModificationException
问题,我不确定这是机器人问题还是构建风格问题:(omg@plackemacher,我在我的
onCreate()
下有分析,根据你的建议我删除了它。现在我的问题是调试测试用例通过,而发布测试用例失败:(我有两种口味,都是
test\u X\u DebugUnitTest
text\u Y\u DebugUnitTest
通过,而
test\u X\u ReleaseUnitTest
text\u ReleaseUnitTest
失败:(你对此有什么想法吗?谢谢你的帮助。@plackemacher兄弟,你能在上看看我的问题吗?谢谢。
public class TestApp extends App {
    @Override
    protected void setupCrashReporting() {
        // Do nothing.
    }
}