我正在尝试使用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()
)));
}
}
谢谢大家的帮助
答案 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