我目前正在对android网站上的样例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)
我试着上网,但没有成功。我希望有人以前解决过这样的问题。我做错了什么?事先非常感谢您的帮助。
我没有进行过单元测试,所以我不能肯定,但看起来你没有为startActivity intent
设置类和上下文。
问题是ActivityUnitTestCase阻止执行startActivity()以提供隔离环境来测试目标活动,如中所述。当TabWidget调用addTab()时,它会调用startActivity()来启动将填充选项卡内容的活动,但startActivity(。
我找不到任何办法来避免这个问题。我只是把它切换到ActivityInstrumentationTestCase2,然后测试就可以了。但是,在这种情况下,我不能使用mock上下文来测试其他东西。此外,它在实际系统下运行活动(我可以在屏幕上看到活动)非常慢(在我的设备上,一个简单的测试需要1秒)。因此,如果您不需要模拟上下文,那么使用ActivityInstumentationTestCase2就是一个解决方案。
问题是ActivityUnitTestCase,因为它只在"单元"上进行测试。如果你想测试它,你必须扩展ActivityInstrumentationTestCase2并检查mathume
如果getActionBar()
可以返回null
,请检查:
private void setupActionBar() {
ActionBar ab = getActionBar();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && ab != null) {
ab.setDisplayHomeAsUpEnabled(true);
}
}
这为我解决了问题。