这与使用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
我需要做些什么特别的事情来检索资源吗?
答案 0 :(得分:0)
我对这个Robolectric一无所知,但getResources()返回null意味着它在框架调用Activity.onCreate()之前被调用。我不知道你从哪里得到这个Activity,但是如果你在Instrumentation之上进行单元测试,你需要确保你的检测线程阻塞,直到主线程完成执行,使用类似的东西:
http://developer.android.com/reference/android/app/Instrumentation.html#waitForIdleSync()
如果您正在使用startActivitySync,则会为您完成此操作: