带有碎片的Android浓缩咖啡。 getActivity返回NULL

时间:2015-10-06 13:02:14

标签: android android-studio ui-testing android-espresso

我正在尝试使用Espresso对一个简单的活动进行一些集成测试,这个活动一旦启动就会触发加载器来检索一些数据。

问题在于,当我运行我的测试时(甚至非常简单,例如检查按钮是否在主页面上),结果会不断变化,并且我会持续不同的时间NPE

  

尝试调用虚方法   ' android.content.Context.getApplicationContext()'在null对象上   参考

我的活动是空的并且包含一个片段,错误可以追溯到何时,为了启动加载器,我要求上下文

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

从此我得到getActivity()有时返回null,然后在这行引发异常(因为在Android Loader类中调用方法context.getApplicationContext)

这是我的测试类

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

谢谢大家的帮助

1 个答案:

答案 0 :(得分:1)

更改您的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