Android 加 Fragments 的浓缩咖啡。 getActivity returns NULL

Android espresso with Fragments. getActivity returns NULL

我正在尝试 运行 在一个简单的 activity 上使用 Espresso 进行一些集成测试,一旦启动就会触发加载程序来检索一些数据。

问题是,当我 运行 我的测试(即使是非常简单的,例如检查主页上是否有按钮)时,结果不断变化,我不断得到不同的时间 NPE

Attempt to invoke virtual method 'android.content.Context.getApplicationContext()' on a null object reference

我的 activity 是空的并包含一个片段,错误可以追溯到何时启动加载程序,我要求提供上下文

MyLoader loader = new MyLoader(getActivity(), certainUrl);

从这里我得到 getActivity() returns null 有时,然后沿着这条线抛出异常(因为在 Android Loader class 方法 context.getApplicationContext 被调用)

这是我的测试class

public class HomeFragmentTest extends ActivityInstrumentationTestCase2<HomeActivity> {

    private HomeActivity _activity;

    public HomeFragmentTest() {
        super(HomeActivity.class);
    }

    protected void setUp() throws Exception {
        super.setUp();
        _activity = getActivity();
        injectInstrumentation(getInstrumentation());
    }

    public void testButton() {
        onView(withId(R.id.button))
                .check(matches(allOf(
                        isDisplayed(),
                        ViewMatchers.isCompletelyDisplayed()
                )));
    }
}

谢谢大家的帮助

更改您的 setUp 方法,如本例所示:

public class FirstActivityUnitTest extends

    android.test.ActivityUnitTestCase<FirstActivity> {

  private FirstActivity activity;

  public FirstActivityUnitTest() {
    super(FirstActivity.class);
  }

  @Override
  protected void setUp() throws Exception {
    super.setUp();
    Intent intent = new Intent(getInstrumentation().getTargetContext(),
        FirstActivity.class);
    startActivity(intent, null, null);
    activity = getActivity();
  }

  @SmallTest
  public void testSomething() {
    // assertions here
  }

  @Override
  protected void tearDown() throws Exception {
    super.tearDown();
  }
}

同时检查 build.gradle 文件中是否有这些依赖项:

 android {
   defaultConfig {
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
           }
        }

 dependencies {  
   androidTestCompile 'com.android.support:support-annotations:23.+'
   androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
   androidTestCompile 'com.android.support.test:runner:0.4.1'
   androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.1'
}

这里最重要的是声明testInstrumentationRunner