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.

这样的方法