6

これは、AndroidでのユニットテストにRobolectricフレームワークを使用することと関係があります。通常の実行では問題のないコードでnullポインター例外が発生します。私はロボエレクトリックを始めたばかりなので、おそらくかなり簡単です。

テスト用の呼び出しコードは次のとおりです。

@Test
    public void testInitUtilsInitSequenceNumberIsRandom() {

    // create an activity for reference 
    InitUtils initUtils = new InitUtils();

    // do static initialization to parse questions into memory
    InitUtils.initialize(initUtils);  // <============ the call from roboelectric framework

    // retreive app state
    AppState appState = (AppState) initUtils.getApplicationContext();

    // fill in later
    fail("not implemented");

}

クラッシュするInitUtils内で呼び出されるメソッドは次のとおりです

/ ***XMLを{@seemQuestions}クラスメンバー変数にロードします**/

   public static void initializeQuestions(Activity activity, AppState appState)                  {

    /* create XML Parser */
    XmlResourceParser questionBatch;      
    /* local question variable */
    Question question = null;

    /* retrieve the XML for parsing */
    // ===============   This returns null  ==============================  
   questionBatch = activity.getResources().getXml(R.xml.questions);

   /* Parse the XML */
   int eventType = -1;     
   /* iterate through XML */
   while (eventType != XmlResourceParser.END_DOCUMENT) {
       if (eventType == XmlResourceParser.START_TAG) {

         /* Get the questions */
         // ================================= NPE exception ====================== 
         String strName = questionBatch.getName();
         ...etc

リソースを取得するためにこれを行うために特別なことをする必要がありますか?

4

1 に答える 1

0

このRobolectricのことについては何も知りませんが、getResources()がnullを返すということは、フレームワークがActivity.onCreate()を呼び出す前に呼び出されていることを意味します。このアクティビティをどこから取得したかはわかりませんが、インストルメンテーションの上で単体テストを行っている場合は、次のようなものを使用して、メイン スレッドの実行が完了するまでインストルメンテーション スレッドがブロックされるようにする必要があります。

http://developer.android.com/reference/android/app/Instrumentation.html#waitForIdleSync()

startActivitySync を使用している場合、これは自動的に行われます。

http://developer.android.com/reference/android/app/Instrumentation.html#startActivitySync(android.content.Intent)

于 2011-10-16T21:45:35.237 に答える