3

現在、 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)

仕方なくネットで検索してみました。誰かが以前にこのような問題を解決したことを願っています。ここで私は何を間違えましたか?どうぞよろしくお願いいたします。

4

4 に答える 4

0

問題は、ここで説明されているように、ActivityUnitTestCase が startActivity() の実行を妨げて、ターゲット アクティビティをテストするための分離された環境を提供することです。TabWidget が addTab() を呼び出すと、startActivity() を呼び出して tabcontent を満たすアクティビティを開始しますが、startActivity() は何も実行しないため、addTab() は NullPointerException で失敗します。

この問題を回避する方法が見つかりません。ActivityInstrumentationTestCase2 に切り替えるだけで、テストはうまくいきます。しかし、この場合、モック コンテキストを使用して他のことをテストすることはできません。また、実際のシステムでアクティビティを実行します (画面でアクティビティを見ることができます)。したがって、コンテキストをモックする必要がない場合は、ActivityInstumentationTestCase2 を使用することで解決できます。

于 2012-03-26T04:22:25.450 に答える
0

私は単体テストを行っていないので、確かなことは言えませんが、のクラスとコンテキストを設定していないようですstartActivity intent

于 2011-06-04T15:36:38.907 に答える