Android / Robolectric框架工作 - 实例化活动在getResource上返回null

时间:2011-03-31 00:55:39

标签: android unit-testing robolectric

这与使用Robolectric框架在Android上进行单元测试有关。我在代码上得到一个空指针异常,正常运行时没有问题。我刚刚开始使用机器人,所以它可能非常简单。

以下是测试的调用代码:

@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加载到{@see mQuestions}类成员变量中     *     * /

   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

我需要做些什么特别的事情来检索资源吗?

1 个答案:

答案 0 :(得分:0)

我对这个Robolectric一无所知,但getResources()返回null意味着它在框架调用Activity.onCreate()之前被调用。我不知道你从哪里得到这个Activity,但是如果你在Instrumentation之上进行单元测试,你需要确保你的检测线程阻塞,直到主线程完成执行,使用类似的东西:

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

如果您正在使用startActivitySync,则会为您完成此操作:

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