次のような状況です。
私のアクティビティには、シリアル化可能なオブジェクトに依存するフラグメントがあります。これが私の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です。これは簡単なはずです。何が欠けていますか?
このように使用するインテントを定義できます
@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);
//...
}
}
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;
}
};
実際にどこからでもアクティビティを開始しているようには見えません。
TestName()の最初の行でgetActivity()
を呼び出してみてください。
これにより、スーパーコンストラクターに渡したアクティビティが起動します。