Espresso Android测试 - 在辅助方法中使用getActivity(无法找到要导入的方法)

时间:2015-06-09 16:08:54

标签: android android-espresso

我正在使用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的方式?

1 个答案:

答案 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等方法。