我正在使用Espresso测试Android应用。我正在尝试在helper类中编写一个辅助函数,该函数可以使用以下代码检查微调器的值:
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的第一个arg都是getActivity()似乎很奇怪。我想在helper函数中调用getActivity(),所以我不需要传递它,但似乎只有因为测试扩展了ActivityInstrumentationTestCase2才可用。有没有办法获得这个价值,而不必将其传递给我的每个助手,或者这不符合Android的方式?
答案 0 :(得分:1)
不,我不认为有一种干净/简单的方法可以从测试之外获取当前的活动。
但是,您可以使用自定义视图匹配器干净利落地完成此操作。像
这样的东西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
等方法。