2017-10-28 116 views
0

我已經顯示它驗證文本咖啡測試:使用espresso時,setContentView可以被android-annotations替換嗎?

public class InformationActivityTests { 
    @Rule 
    public ActivityTestRule<InformationActivity_> mInformationActivityTestRule = 
      new ActivityTestRule<InformationActivity_>(InformationActivity_.class) { 
       @Override 
       protected Intent getActivityIntent() { 
        Intent i = new Intent(getTargetContext(), InformationActivity_.class); 
        i.putExtra("INFORMATION", "Espresso"); 
        return i; 
       } 
      }; 

    @Test 
    public void textIsDisplayed() { 
     onView(withText("Espresso")).check(matches(isDisplayed())); 
    } 
} 

這個測試通過當活動有以下代碼:

@EActivity 
public class InformationActivity extends AppCompatActivity { 
    @ViewById(R.id.information_view) 
    TextView informationView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_information); 

     Intent intent = getIntent(); 
     String information = intent.getStringExtra("INFORMATION"); 
     informationView.setText(information); 
    } 
} 

失敗當我「移動」的setContentView到@ EActivity註釋:

@EActivity(R.layout.activity_information) 
public class InformationActivity extends AppCompatActivity { 
    @ViewById(R.id.information_view) 
    TextView informationView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Intent intent = getIntent(); 
     String information = intent.getStringExtra("INFORMATION"); 
     informationView.setText(information); 
    } 
} 

E RROR是:

了java.lang.RuntimeException:無法啓動活動ComponentInfo {com.edu/com.edu.InformationActivity_}:顯示java.lang.NullPointerException:嘗試調用虛擬方法「無效android.widget.TextView .setText(java.lang.CharSequence)'在一個空對象引用

我做錯了什麼,或者它是與espresso/android-annotations的問題?

+1

https://github.com/androidannotations/androidannotations/issues/1009#issuecomment-43714777這個答案建議使用'@ AfterViews'註釋上方法與視圖配置。我沒有使用android-annotations思想的經驗。 –

+0

謝謝,它的工作原理。其實你的答案比我的好,所以隨時發佈,我會接受。 – LLL

+0

你的調查更有意義的完整答案,所以發表什麼工作,並接受你自己的答案;) –

回答

1

我檢查通過@EActivity(R.layout.activity_information)當Android的註釋生成的代碼,這是怎樣的onCreate看起來像生成的類(InformationActivity_):

public void onCreate(Bundle savedInstanceState) { 
    OnViewChangedNotifier previousNotifier = OnViewChangedNotifier.replaceNotifier(onViewChangedNotifier_); 
    init_(savedInstanceState); 
    super.onCreate(savedInstanceState); 
    OnViewChangedNotifier.replaceNotifier(previousNotifier); 
    setContentView(R.layout.activity_information); 
} 

的問題是,它首先調用super.onCreate(如此創建自InformationActivity),我在此處理intent和TextView,然後調用setContentView,這不能像那樣工作。

對此的解決方案是Be_Negative建議的,所以使用@AfterViews註釋。它還簡化了代碼位(我可以刪除onCreate方法):

@EActivity(R.layout.activity_information) 
public class InformationActivity extends AppCompatActivity { 
    @ViewById(R.id.information_view) 
    TextView informationView; 

    @AfterViews 
    void handleIntent() { 
     Intent intent = getIntent(); 
     String information = intent.getStringExtra("INFORMATION"); 
     informationView.setText(information); 
    }  
} 
0

你的問題是,你永遠不會初始化資訊查看

public class InformationActivity extends AppCompatActivity { 
@ViewById(R.id.information_view) 
TextView informationView; //<-- Null 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent intent = getIntent(); 
    String information = intent.getStringExtra("INFORMATION"); 
    informationView.setText(information); //<--STILL NULL 
} 
} 

所以,你首先必須初始化視圖。

+0

不,它由@ViewById初始化。如果你是對的,那麼測試在第一種情況下也會失敗。 – LLL

相關問題