UnitTesting Android TabActivity时获取Nullpointer异常

Posted

技术标签:

【中文标题】UnitTesting Android TabActivity时获取Nullpointer异常【英文标题】:Getting Nullpointer exception when UnitTesting Android TabActivity 【发布时间】:2011-09-08 09:09:51 【问题描述】:

我目前正在对来自android website 的示例 TabLayout 进行单元测试。像这样对它进行单元测试时,我得到了 NullPointerException:

public class MainActivityUnitTest extends ActivityUnitTestCase<MainActivity>

    public MainActivityUnitTest()
        super(MainActivity.class);      
    

    @MediumTest
    public void testStartActivity()
        setActivity(startActivity(new Intent(Intent.ACTION_MAIN), null, null));
    

这是我得到的例外:

java.lang.NullPointerException
at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:277)
at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654)
at android.widget.TabHost.setCurrentTab(TabHost.java:326)
at android.widget.TabHost.addTab(TabHost.java:216)
at com.foo.android.MainActivity.onCreate(MainActivity.java:55)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.test.ActivityUnitTestCase.startActivity(ActivityUnitTestCase.java:159)
at com.foo.android.test.MainActivityUnitTest.testStartActivity(MainActivityUnitTest.java:17)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:204)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:194)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448)

我试图在网上搜索但没有运气。我希望有人以前解决过这样的问题。我在这里做错了什么?非常感谢您的帮助。

【问题讨论】:

欧盟解决了这个问题吗? 你能做到吗? 【参考方案1】:

我没有进行过单元测试,所以我不能肯定地说,但看起来你没有为 startActivity intent 设置类和上下文。

【讨论】:

我不这么认为。它适用于正常活动。 TabActivity 失败了。【参考方案2】:

问题是 ActivityUnitTestCase 阻止执行 startActivity() 以提供隔离环境来测试目标活动,如here 中所述。当 TabWidget 调用 addTab() 时,它调用 startActivity() 来启动将填充选项卡内容的活动,但 startActivity() 什么也不做,因此 addTab() 失败并出现 NullPointerException。

我找不到任何方法来避免这个问题。我只是将它切换到 ActivityInstrumentationTestCase2 然后测试正常。但是,在这种情况下,我不能使用模拟上下文来测试其他东西。此外,它在实际系统下运行活动(我可以在屏幕上看到活动)非常缓慢(只需在我的设备上进行一个简单的测试就需要 1 秒)。因此,如果您不需要模拟上下文,使用 ActivityInstumentationTestCase2 可以是一个解决方案。

【讨论】:

【参考方案3】:

问题是 ActivityUnitTestCase 因为它只在“单元”操作栏上进行测试,如果你想测试它,你必须扩展 ActivityInstrumentationTestCase2 和看看数学怎么说

【讨论】:

【参考方案4】:

如果getActionBar() 可以返回null,请检查:

private void setupActionBar() 
    ActionBar ab = getActionBar();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && ab != null) 
        ab.setDisplayHomeAsUpEnabled(true);
    

这为我解决了这个问题。

【讨论】:

以上是关于UnitTesting Android TabActivity时获取Nullpointer异常的主要内容,如果未能解决你的问题,请参考以下文章

在哪里可以找到“Microsoft.VisualStudio.TestTools.UnitTesting”缺失的 dll?

浏览器中的 Silverlight UnitTesting Mock<FileInfo>

PyDev unittesting:如何在“捕获的输出”中捕获记录到 logging.Logger 的文本

ImageClassification.Fit-IndexOutOfRangeException

API测试

headless browers