Android - ActivityUnitTestCase 测试类中 startActivity 方法上的 AssertionFailedError

Posted

技术标签:

【中文标题】Android - ActivityUnitTestCase 测试类中 startActivity 方法上的 AssertionFailedError【英文标题】:Android - AssertionFailedError on startActivity method in ActivityUnitTestCase test class 【发布时间】:2014-08-25 22:46:01 【问题描述】:

我正在尝试测试模块中的活动。我只是想在测试方法中开始这个活动,但我总是有一个AssertionFailedError。我在网上搜索了这个问题,但找不到任何解决方案。任何帮助表示赞赏。

这是我的测试课:

public class ContactActivityTest extends ActivityUnitTestCase<ContactActivity> 

    public ContactActivityTest() 
        super(ContactActivity.class);
    


    @Override
    public void setUp() throws Exception 
        super.setUp();
    


    public void testWebViewHasNotSetBuiltInZoomControls() throws Exception 
        Intent intent = new Intent(getInstrumentation().getTargetContext(),
                ContactActivity.class);
        startActivity(intent, null, null);
    


    @Override
    public void tearDown() throws Exception 
        super.tearDown();
    

这是错误:

junit.framework.AssertionFailedError
at android.test.ActivityUnitTestCase.startActivity(ActivityUnitTestCase.java:147)
at com.modilisim.android.contact.ContactActivityTest.testWebViewHasNotSetBuiltInZoomControls(ContactActivityTest.java:29)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1763)

问候。

【问题讨论】:

您是否尝试过使用空活动,或者可能是 ContactActivity 代码导致错误? @Simas 很可能是,问题是代码的哪一部分。我尝试使用 FragmentActivityActivity 的扩展名,我清空了后者的代码,但它仍然因同样的问题而崩溃。 我相信你需要在 setUp() 中有 startActivity(...) 代码你能检查一下吗,如果是,我会添加一个答案让你接受。 @MGranja 那是处理调用测试方法的 JUnit 3 @DougEdey 根据javadoc,不应在 setUp() 中调用它(因为 ClassLoader 问题),但我还是尝试调用 setUp 或 test 方法,但问题相同。 【参考方案1】:

ActivityUnitTestCase 的startActivity() 方法只需要在主线程上调用。

这可以通过以下方式完成:

    在您的测试方法之前使用 @UiThreadTest 注释:

    @UiThreadTest
    public void testWebViewHasNotSetBuiltInZoomControls() throws Exception 
        Intent intent = new Intent(getInstrumentation().getTargetContext(),
                ContactActivity.class);
        startActivity(intent, null, null);
    
    

    使用 Instrumentation 类的 runOnMainSync 方法:

    public void testWebViewHasNotSetBuiltInZoomControls() throws Exception 
        final Intent intent = new Intent(getInstrumentation().getTargetContext(),
                ContactActivity.class);
    
        getInstrumentation().runOnMainSync(new Runnable() 
            @Override
            public void run() 
                startActivity(intent, null, null);
               
            );
     
    

Why am I right?

【讨论】:

很抱歉,我无法验证答案以给您最初的赏金。但是注释解决了这个问题,所以在这里修复它,你应该得到这个赏金。谢谢! 这个答案解决了这个问题,如果问题的 OP 接受这个作为答案,那就太好了。 您可能想要扩展 ActivityInstrumentationTestCase2

以上是关于Android - ActivityUnitTestCase 测试类中 startActivity 方法上的 AssertionFailedError的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录