Espresso Android 测试 - 在辅助方法中使用 getActivity(找不到要导入的方法)
Espresso Android testing - using getActivity in a helper method (can't find method to import)
我正在使用 Espresso 测试 Android 应用程序。我正在尝试在助手 class 中编写一个辅助函数,它可以使用以下代码检查微调器的值:
public static void assertSpinner(MainActivity activity, int id, int val) {
Spinner s = (Spinner) activity.findViewById(id);
assertNotNull(s);
assertEquals(val, s.getSelectedItemPosition());
}
然后我可以通过以下方式从我的测试中调用助手:
assertSpinner(getActivity(),R.id.someSpinner,12);
尽管每个 assertSpinner 的第一个参数都是 getActivity() 似乎很奇怪。我想改为在辅助函数中调用 getActivity(),这样我就不需要传递它,但它似乎只可用,因为测试扩展了 ActivityInstrumentationTestCase2。有什么方法可以获取这个值而不必将它传递给我的每个助手,或者这不符合 Android 方式吗?
不,我认为没有 clean/easy 方法可以从测试外部获取当前 Activity。
但是,您可以使用自定义视图匹配器干净地完成此操作。像
static Matcher<View> withSelectedItemPosition(final int selectedItemPosition) {
return new BoundedMatcher<View, Spinner>(Spinner.class) {
@Override protected boolean matchesSafely(Spinner spinner) {
return spinner.getSelectedItemPosition() == selectedItemPosition;
}
@Override public void describeTo(Description description) {
description.appendText("with selected item position: ")
.appendValue(selectedItemPosition);
}
};
}
那你可以
onView(withId(R.id.my_spinner)).check(matches(withSelectedItemPosition(5)));
这是一些额外的代码,但更加地道。 Espresso 确实不鼓励您直接与视图层次结构进行交互;理想情况下,你的测试不应该调用像 findViewById
.
这样的方法
我正在使用 Espresso 测试 Android 应用程序。我正在尝试在助手 class 中编写一个辅助函数,它可以使用以下代码检查微调器的值:
public static void assertSpinner(MainActivity activity, int id, int val) {
Spinner s = (Spinner) activity.findViewById(id);
assertNotNull(s);
assertEquals(val, s.getSelectedItemPosition());
}
然后我可以通过以下方式从我的测试中调用助手:
assertSpinner(getActivity(),R.id.someSpinner,12);
尽管每个 assertSpinner 的第一个参数都是 getActivity() 似乎很奇怪。我想改为在辅助函数中调用 getActivity(),这样我就不需要传递它,但它似乎只可用,因为测试扩展了 ActivityInstrumentationTestCase2。有什么方法可以获取这个值而不必将它传递给我的每个助手,或者这不符合 Android 方式吗?
不,我认为没有 clean/easy 方法可以从测试外部获取当前 Activity。
但是,您可以使用自定义视图匹配器干净地完成此操作。像
static Matcher<View> withSelectedItemPosition(final int selectedItemPosition) {
return new BoundedMatcher<View, Spinner>(Spinner.class) {
@Override protected boolean matchesSafely(Spinner spinner) {
return spinner.getSelectedItemPosition() == selectedItemPosition;
}
@Override public void describeTo(Description description) {
description.appendText("with selected item position: ")
.appendValue(selectedItemPosition);
}
};
}
那你可以
onView(withId(R.id.my_spinner)).check(matches(withSelectedItemPosition(5)));
这是一些额外的代码,但更加地道。 Espresso 确实不鼓励您直接与视图层次结构进行交互;理想情况下,你的测试不应该调用像 findViewById
.