6

私は2つの異なるActivityクラスをテストしようとしていますが、一方Activityがもう一方を呼び出しています。これが私のコードで、問題を説明します。

IntroActivityTest

public class IntroActivityTest extends ActivityInstrumentationTestCase2<IntroActivity> {

    IntroActivity activity;

    public IntroActivityTest() {

        super( IntroActivity.class );
    }

    @Override
    protected void setUp() throws Exception {

        super.setUp();
        activity = getActivity();
    }

    public void testIntroBypass() {

        if ( new SharedPreferencesHelper( getInstrumentation().getTargetContext() ).retrieveUserToken() == null ) {
            assertTrue( !activity.isFinishing() );
        }
        else {
            assertTrue( activity.isFinishing() );
        }
    }
}

RootActivityTest:

public class RootActivityTest extends ActivityInstrumentationTestCase2<RootActivity> {

    RootActivity activity;

    public RootActivityTest() {

        super( RootActivity.class );
    }

    @Override
    protected void setUp() throws Exception {

        super.setUp();
        activity = getActivity();
    }

    public void testInitialTab() {

        assertTrue( activity.getSupportActionBar().getSelectedTab().getText().toString().equalsIgnoreCase( "Library" ) );
    }
}

IntroActivityTest、fromのユーザートークンSharedPreferencesがnull以外の場合、すぐに開始しますRootActivity。nullの場合は、に留まりますIntroActivity。問題は、それがnullでない場合、最初のテスト(IntroActivityTest)に合格し、getActivity()メソッド呼び出しでハングしRootActivityTest、テストがフリーズすることです...例外はなく、その行でハングします。ユーザートークンがnullの場合、両方のテストを完全に正常に実行します。

これを引き起こしている可能性がありますか?観察から、から開始されたRootActivityTestを使用しようとしているように見えますが、それ自体のインスタンスを開始するべきではありませんか?RootActivityIntroActivityRootActivity

4

2 に答える 2

7

ActivityInstrumentationTestCase2 APIによると:

このクラスは、単一のアクティビティの機能テストを提供します。テスト対象のアクティビティは、システムインフラストラクチャを使用して(InstrumentationTestCase.launchActivity()を呼び出して)作成され、アクティビティを直接操作できるようになります。

各ActivityInstrumentationTestCase2実装は完全に分離されており、他のActivityInstrumentationTestCase2実装に依存しない独自のライフサイクルを持っています。テスト可能なアクティビティは、テスト対象のアプリケーション自体からではなく、常にインストルメンテーションインフラストラクチャを介して作成する必要があります。あなたの場合、RootActivityTestは、IntroActivityによって開始されたRootActivityをアプリケーションから取得せず、RootActivityに対してテストを継続的に実行します。どこからともなく(InstrumentationTestRunnerによってではなく)RootActivityが発生し、前面に表示された場合、RootActivityTestを実行すると、テスト可能なRootActivityを作成しようとすると混乱し、この見知らぬ人が殺されるのを待つだけです。

必要なものをテストするために、つまりSharedPreferencesのユーザートークンがnullでない場合、すぐにRootActivityを開始します。nullの場合、IntroActivityに残ります。すべてをIntroActivityTestに書き込み、Instrumentation.ActivityMonitorを使用して、 IntroActivityから開始されたRootActivityを検出できます。コードサンプルについては、こちらをご覧ください。RootActivityTestでgetActivity()を呼び出したときにRootActivityを正しく開始できるように、IntroActivityTestでテストを完了した後にRootActivityを終了する必要があることに注意してください。

RootActivityTestを使用して、RootActivityが開始されて前面に表示された後、すべてをテストします。たとえば、TextViewは適切にレンダリングされ、ボタンをクリックすると正しい処理が実行されます。RootActivityTestでは、RootActivityがどこでどのように開始されるかを気にする必要はありません。 、getActivity()を呼び出して、インストルメンテーションにテスト可能なRootActivityを要求するだけです。

于 2012-08-02T21:55:08.433 に答える
0

以前のテストでアクティビティが終了していないときに同じ問題に直面し、新しいテストでも同じように意図的に開始しました。しかし、OS Androidは、アクティビティがすでに開始されており、何も実行されていないことを確認しているため、InstrumentationTestCaseすでにtsartedされているアクティビティを待ち始めました。

于 2016-05-06T09:41:31.600 に答える