Activity 因 Junit ActivityTestRule 缺少参数而崩溃
Activity crash from missing argument with Junit ActivityTestRule
我有一个用于 UI 测试的 Espresso 测试套件,如下所示:
@RunWith(AndroidJUnit4.class)
public class SpecialUiTests {
@Rule
public final ActivityTestRule<SpecialActivity> activity
= new ActivityTestRule<>(SpecialActivity.class);
@Test
public void specialTest() {
...
}
...
}
问题是,activity 需要一个包,当找不到它期望的值时崩溃
public class SpecialActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
final String specialValue = getIntent().getBundleExtra(ARG_SPECIAL_BUNDLE)
.getString(KEY_SPECIAL_VALUE);
//Do something with specialValue <--- Crash
}
...
}
我可以设置一个测试规则并仍然传递 activity 期望的参数(一个包)吗?
@Rule
public ActivityTestRule activityRule = new ActivityTestRule<>(
SpecialActivity.class,
true, // initialTouchMode
false); //Lazy launching
@Test
public void specialTest() {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString(SpecialActivity.KEY_SPECIAL_VALUE, "789");
intent.putExtra(SpecialActivity.ARG_SPECIAL_BUNDLE, bundle);
activityRule.launchActivity(intent);
onView(withId(R.id.special))
.check(matches(withText("789")));
}
来源:http://blog.sqisland.com/2015/04/espresso-21-activitytestrule.html
您还可以覆盖 ActivityTestRule
的 getActivityIntent()
来创建 Intent。这样一来,具有适当 Intent 的 Activity 会自动为您的所有测试方法启动。示例:
@Rule
public ActivityTestRule<SpecialActivity> mActivity = new ActivityTestRule<SpecialActivity>(SpecialActivity.class) {
@Override
protected Intent getActivityIntent() {
final Context targetContext = InstrumentationRegistry.getTargetContext();
final Intent intent = new Intent(targetContext, SpecialActivity.class);
intent.putExtra("arg_one", 1);
return intent;
}
};
我有一个用于 UI 测试的 Espresso 测试套件,如下所示:
@RunWith(AndroidJUnit4.class)
public class SpecialUiTests {
@Rule
public final ActivityTestRule<SpecialActivity> activity
= new ActivityTestRule<>(SpecialActivity.class);
@Test
public void specialTest() {
...
}
...
}
问题是,activity 需要一个包,当找不到它期望的值时崩溃
public class SpecialActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
final String specialValue = getIntent().getBundleExtra(ARG_SPECIAL_BUNDLE)
.getString(KEY_SPECIAL_VALUE);
//Do something with specialValue <--- Crash
}
...
}
我可以设置一个测试规则并仍然传递 activity 期望的参数(一个包)吗?
@Rule
public ActivityTestRule activityRule = new ActivityTestRule<>(
SpecialActivity.class,
true, // initialTouchMode
false); //Lazy launching
@Test
public void specialTest() {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString(SpecialActivity.KEY_SPECIAL_VALUE, "789");
intent.putExtra(SpecialActivity.ARG_SPECIAL_BUNDLE, bundle);
activityRule.launchActivity(intent);
onView(withId(R.id.special))
.check(matches(withText("789")));
}
来源:http://blog.sqisland.com/2015/04/espresso-21-activitytestrule.html
您还可以覆盖 ActivityTestRule
的 getActivityIntent()
来创建 Intent。这样一来,具有适当 Intent 的 Activity 会自动为您的所有测试方法启动。示例:
@Rule
public ActivityTestRule<SpecialActivity> mActivity = new ActivityTestRule<SpecialActivity>(SpecialActivity.class) {
@Override
protected Intent getActivityIntent() {
final Context targetContext = InstrumentationRegistry.getTargetContext();
final Intent intent = new Intent(targetContext, SpecialActivity.class);
intent.putExtra("arg_one", 1);
return intent;
}
};