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

Espresso Android测试-在助手方法中使用getActivity(无法找到要导入的方法),android,android-espresso,Android,Android Espresso,我正在用浓缩咖啡测试Android应用程序。我试图在一个helper类中编写一个helper函数,该类可以使用以下代码检查微调器的值: public static void assertSpinner(MainActivity activity, int id, int val) { Spinner s = (Spinner) activity.findViewById(id); assertNotNull(s); assertEquals(val, s.getSelec

我正在用浓缩咖啡测试Android应用程序。我试图在一个helper类中编写一个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的第一个参数都是getActivity()似乎很奇怪。我想改为在helper函数中调用getActivity(),这样就不需要传递它,但这似乎只是因为测试扩展了ActivityInstrumentationTestCase2才可用。是否有任何方法可以获得此值而不必将其传递给我的每个助手,或者这不符合Android方式?

不,我认为没有一种干净/简单的方法可以从测试之外获取当前活动

但是,您可以使用自定义视图匹配器干净地执行此操作。差不多

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);
    }
  };
}

这是一个额外的代码,但更惯用。Espresso确实不鼓励您直接与视图层次进行交互;理想情况下,您的测试不应该调用像
findViewById

这样的方法,看起来它对int位置有效,但我尝试使用spinner.getSelectedItem().toString()重写它以匹配字符串,但它似乎不起作用,它告诉我它需要字符串,但它得到了spinner?嗯,这应该可以正常工作。你能公布准确的错误吗?确认。我的代码很差。固定的。感谢并选择您的答案。:)
onView(withId(R.id.my_spinner)).check(matches(withSelectedItemPosition(5)));