[英]Android espresso with Fragments. getActivity returns NULL
我正在嘗試在一個簡單的活動上使用 Espresso 運行一些集成測試,該活動一旦啟動就會觸發加載程序來檢索一些數據。
問題是,當我運行我的測試(甚至非常簡單,例如檢查主頁上是否有按鈕)時,結果不斷變化,並且我不斷獲得 NPE
嘗試在空對象引用上調用虛擬方法“android.content.Context.getApplicationContext()”
我的活動是空的並持有一個片段,錯誤可以追溯到何時啟動加載程序,我要求上下文
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()
)));
}
}
謝謝大家的幫助
像這個例子一樣改變你的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.