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
我正在尝试 运行 在一个简单的 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