当运行AndroidJUnitRunner时,ActivityUnitTestCase引发RuntimeException

当运行AndroidJUnitRunner时,ActivityUnitTestCase引发RuntimeException,第1张

概述我正在尝试将 Espresso 2.0’s AndoridJUnitRunner与ActivityUnitTestCase集成.不过,我的测试在 startActivity() tries to initialize mMockParent = new MockParent()时崩溃了. 这是我做的: 使用Intellij 14 CE创建一个新项目,并对build.gradle进行一些更改. an 我正在尝试将 Espresso 2.0’s AndoridJUnitRunner与ActivityUnitTestCase集成.不过,我的测试在 startActivity() tries to initialize mMockParent = new MockParent()时崩溃了.

这是我做的:

使用Intellij 14 CE创建一个新项目,并对build.gradle进行一些更改.

androID{    defaultConfig {        applicationID "com.noob.testing"        minSdkVersion 9        targetSdkVersion 21        versionCode 1        versionname "1.0"        testInstrumentationRunner "androID.support.test.runner.AndroIDJUnitRunner"    }    compileOptions {        sourceCompatibility JavaVersion.VERSION_1_7        targetCompatibility JavaVersion.VERSION_1_7    }}dependencIEs {    compile filetree(dir: 'libs',include: ['*.jar'])    compile 'com.androID.support:appcompat-v7:21.0.+'    androIDTestCompile('org.mockito:mockito-core:1.9.5')    androIDTestCompile('com.Google.dexmaker:dexmaker:1.2')    androIDTestCompile('com.Google.dexmaker:dexmaker-mockito:1.2')    androIDTestCompile('com.androID.support.test.espresso:espresso-core:2.0')    androIDTestCompile('com.androID.support.test:testing-support-lib:0.1')}

编写一个JUnit4风格的单元测试.

@RunWith(AndroIDJUnit4.class)public class MainActivityJUnit4Test extends ActivityUnitTestCase<MainActivity> {    public MainActivityJUnit4test() {        super(MainActivity.class);    }    MainActivity activity;    @Before    public voID setup() throws Exception {        injectInstrumentation(InstrumentationRegistry.getInstrumentation());        super.setUp();        ContextthemeWrapper context = new ContextthemeWrapper(getInstrumentation().getTargetContext(),R.style.Apptheme);        setActivityContext(context);        activity = startActivity(new Intent(Intent.ACTION_MAIN),null,null);    }    @Test    public voID baseCase() {        TextVIEw tv = (TextVIEw) activity.findVIEwByID(R.ID.tv);        Assert.assertEquals("Hello World",tv.getText());    }}

运行测试,获取堆栈跟踪.

junit.framework.AssertionFailedErrorat junit.framework.Assert.fail(Assert.java:48)at junit.framework.Assert.assertTrue(Assert.java:20)at junit.framework.Assert.assertNotNull(Assert.java:218)at junit.framework.Assert.assertNotNull(Assert.java:211)at androID.test.ActivityUnitTestCase.startActivity(ActivityUnitTestCase.java:147)at com.sdchang.testing.MainActivityJUnit4Test.setup(MainActivityJUnit4Test.java:32)at java.lang.reflect.Method.invokeNative(Native Method)at java.lang.reflect.Method.invoke(Method.java:525)at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:45)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)at org.junit.runners.BlockJUnit4ClassRunner.runchild(BlockJUnit4ClassRunner.java:68)at org.junit.runners.BlockJUnit4ClassRunner.runchild(BlockJUnit4ClassRunner.java:47)at org.junit.runners.ParentRunner.run(ParentRunner.java:231)at org.junit.runners.ParentRunner.schedule(ParentRunner.java:60)at org.junit.runners.ParentRunner.runchildren(ParentRunner.java:229)at org.junit.runners.ParentRunner.access
java.lang.RuntimeException: Can't create handler insIDe thread that has not called Looper.prepare()
0(ParentRunner.java:50)at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:222)at org.junit.runners.ParentRunner.run(ParentRunner.java:300)at org.junit.runners.Suite.runchild(Suite.java:128)at org.junit.runners.Suite.runchild(Suite.java:24)at org.junit.runners.ParentRunner.run(ParentRunner.java:231)at org.junit.runners.ParentRunner.schedule(ParentRunner.java:60)at org.junit.runners.ParentRunner.runchildren(ParentRunner.java:229)at org.junit.runners.ParentRunner.access
Componentname cn = new Componentname(mActivityClass.getPackage().getname(),mActivityClass.getname());            intent.setComponent(cn);            ActivityInfo info = new ActivityInfo();            CharSequence Title = mActivityClass.getname();            mMockParent = new MockParent();            String ID = null;
0(ParentRunner.java:50)at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:222)at org.junit.runners.ParentRunner.run(ParentRunner.java:300)at org.junit.runner.JUnitCore.run(JUnitCore.java:157)at org.junit.runner.JUnitCore.run(JUnitCore.java:136)at androID.support.test.runner.AndroIDJUnitRunner.onStart(AndroIDJUnitRunner.java:270)at androID.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)

这个堆栈跟踪实际上是一个反思

runOnMainSync()

发生在startActivity() tries to initialize mMockParent = new MockParent():

getInstrumentation().runOnMainSync(new Runnable() {    @OverrIDe    public voID run() {        activity = startActivity(new Intent(Intent.ACTION_MAIN),null);    }});

我还缺少什么让AndroIDJUnitRunner使用ActivityUnitTestCase?任何帮助将不胜感激.

解决方法@H_419_28@ 我的头撞在墙上,窗户和各种家具后,终于让我的测试工作了!

从a response on its issue tracker起,我了解到,不能从仪器线程创建新的处理程序.这意味着必须在UI线程中调用startActivity().这导致3个解决方案.

使用仪器的

@OverrIDeprotected T startActivity(final Intent intent,final Bundle savedInstanceState,final Object lastNonConfigurationInstance) {    return startActivityOnMainThread(intent,savedInstanceState,lastNonConfigurationInstance);}private T startActivityOnMainThread(final Intent intent,final Object lastNonConfigurationInstance) {    final atomicreference<T> activityRef = new atomicreference<>();    final Runnable activityRunnable = new Runnable() {        @OverrIDe        public voID run() {            activityRef.set(YourBaseActivityUnitTestCase.super.startActivity(                    intent,lastNonConfigurationInstance));        }    };    if (Looper.myLooper() != Looper.getMainLooper()) {        getInstrumentation().runOnMainSync(activityRunnable);    } else {        activityRunnable.run();    }    return activityRef.get();}

2.创建自己的基类,扩展ActivityUnitTestCase并覆盖startActivity

3.如果在测试方法中调用startActivity(),并且整个测试可以在主线程上运行,则可以使用@UiThreadTest简单地注释测试方法.

在我的测试中,我已经尝试了所有3种解决方案,但只有1& 2会奏效

总结

以上是内存溢出为你收集整理的当运行AndroidJUnitRunner时,ActivityUnitTestCase引发RuntimeException全部内容,希望文章能够帮你解决当运行AndroidJUnitRunner时,ActivityUnitTestCase引发RuntimeException所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1131377.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存