web-dev-qa-db-ja.com

Intentに依存するEspresso startActivity

次のような状況です。

私のアクティビティには、シリアル化可能なオブジェクトに依存するフラグメントがあります。これが私のonCreateです。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    MyObject myObj = (MyObj) getIntent().getSerializableExtra("myobj");

    if(myObj != null) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.add(R.id.container, MyFragment.newInstance(myObj));
        transaction.commit();
    }
}

しかし、Espressoテストでは、アクティビティが作成される前に、そのアクティビティにインテントを渡すことはできません。私はいくつかの方法でsetActivityIntentを試しましたが、それを機能させる方法を理解できません。

これが私の最後の試みです:

import Android.content.Intent;
import Android.support.test.InstrumentationRegistry;
import Android.support.test.espresso.Espresso;
import Android.test.ActivityInstrumentationTestCase2;
import org.junit.Before;

import static Android.support.test.espresso.assertion.ViewAssertions.matches;
import static Android.support.test.espresso.matcher.ViewMatchers.withId;
import static Android.support.test.espresso.matcher.ViewMatchers.withText;

public class MyActivityTest extends

     ActivityInstrumentationTestCase2<MyActivity> {

        private MyActivity activity;
        private MyObject myObj;

        public MyActivityTest() {
            super(MyActivity.class);
        }

        @Before
        protected void setUp() throws Exception {
            super.setUp();
            injectInstrumentation(InstrumentationRegistry.getInstrumentation());
            myObj = MyObject.mockObject();
            Intent i = new Intent();
            i.putExtra("myobj", myObj);
            setActivityIntent(i);

        }

        public void testName(){
            Espresso.onView(withId(R.id.name)).check(matches(withText(myObj.getObjName())));
        }

    }

私はたくさん検索しましたが、何も機能しません。テストではMyObjectは常にnullです。これは簡単なはずです。何が欠けていますか?

21
rafael

このように使用するインテントを定義できます

@RunWith(AndroidJUnit4.class)
public class MyActivityTestTest {

    private MyObject myObj;

    @Rule
    // third parameter is set to false which means the activity is not started automatically
    public ActivityTestRule<MyActivity> mActivityRule =
        new ActivityTestRule<>(MyActivity.class, false, false);


    @Test
    public void testName() {

          myObj = MyObject.mockObject();
          Intent i = new Intent();
          i.putExtra("myobj", myObj);
          mActivityRule.launchActivity(i);

         //...
    }

}
29

ActivityTestRule.getActivityIntent() メソッドをオーバーライドして、必要なインテントを返すことができます。

@Rule
public ActivityTestRule<MyActivity> mActivityRule =
        new ActivityTestRule<MyActivity>(MyActivity.class){

    @Override
    protected Intent getActivityIntent() {
        Intent intent = new Intent();
        intent.putExtra("myobj", myObj);
        return intent;
    }
};
14
makovkastar

実際にどこからでもアクティビティを開始しているようには見えません。

TestName()の最初の行でgetActivity()を呼び出してみてください。

これにより、スーパーコンストラクターに渡したアクティビティが起動します。

0
yogurtearl