Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:XmlPullParserFactory.newInstance()创建空工厂_Android_Xml_Unit Testing_Parsing_Xmlpullparser - Fatal编程技术网

Android:XmlPullParserFactory.newInstance()创建空工厂

Android:XmlPullParserFactory.newInstance()创建空工厂,android,xml,unit-testing,parsing,xmlpullparser,Android,Xml,Unit Testing,Parsing,Xmlpullparser,我试图让XmlPullParser工作,因为它比其他选择更有意义。然而,当XmlPullParserFactory.newInstance()函数返回一个空工厂(调试器可以看到)时,我遇到了第一个障碍。因此,只要调用factory.newPullParser(),就会引发异常 import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import org.xmlpull.v1.Xml

我试图让
XmlPullParser
工作,因为它比其他选择更有意义。然而,当
XmlPullParserFactory.newInstance()
函数返回一个空工厂(调试器可以看到)时,我遇到了第一个障碍。因此,只要调用
factory.newPullParser()
,就会引发异常

import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

public class XMLParser
{
    public static void getXML(InputStream in)
            throws XmlPullParserException, IOException {
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser xpp = factory.newPullParser();

            xpp.setInput(new StringReader("<foo>Hello World!</foo>"));
            int eventType = xpp.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                if (eventType == XmlPullParser.START_DOCUMENT) {
                    System.out.println("Start document");
                } else if (eventType == XmlPullParser.START_TAG) {
                    System.out.println("Start tag " + xpp.getName());
                } else if (eventType == XmlPullParser.END_TAG) {
                    System.out.println("End tag " + xpp.getName());
                } else if (eventType == XmlPullParser.TEXT) {
                    System.out.println("Text " + xpp.getText());
                }
                eventType = xpp.next();
            }
            System.out.println("End document");
        } catch (Exception e) {
        }
    }
}

您不能对Android的组件进行单元测试。用于编译的JAR文件只包含引发异常的方法存根。考虑一个简单的测试用例

public class UnitTest {
    @Test
    public void instanceNotNull() throws Exception {
        assertNotNull(XmlPullParserFactory.newInstance());
    }
}
在没有定义任何配置的情况下运行它,您将获得

java.lang.RuntimeException: Method newInstance in org.xmlpull.v1.XmlPullParserFactory not mocked. See http://g.co/androidstudio/not-mocked for details.
    at org.xmlpull.v1.XmlPullParserFactory.newInstance(XmlPullParserFactory.java)
    at ...
添加时

testOptions {
    unitTests.returnDefaultValues = true
}
对于gradleandroid配置,您会发现断言测试失败

如果您想使用android库进行测试,您需要在带有仪器化测试的设备上进行测试。因此,将您的测试用例放在androidTest源集中,添加

dependencies {
    testCompile 'junit:junit:4.12'
    androidTestCompile 'com.android.support.test:runner:0.4'
}
到模块的gradle文件,并在设备上运行它


有关更多信息,请参阅和。

只需将这一行添加到您的愿望列表中即可

                (new Thread() {
                    @Override
                    public void run() {
                        try {
                            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                            XmlPullParser xpp = factory.newPullParser();

                            xpp.setInput(new StringReader("<foo>Hello World!</foo>"));
                            int eventType = xpp.getEventType();
                            while (eventType != XmlPullParser.END_DOCUMENT) {
                                if (eventType == XmlPullParser.START_DOCUMENT) {
                                    System.out.println("Start document");
                                } else if (eventType == XmlPullParser.START_TAG) {
                                    System.out.println("Start tag " + xpp.getName());
                                } else if (eventType == XmlPullParser.END_TAG) {
                                    System.out.println("End tag " + xpp.getName());
                                } else if (eventType == XmlPullParser.TEXT) {
                                    System.out.println("Text " + xpp.getText());
                                }
                                eventType = xpp.next();
                            }
                            System.out.println("End document");
                        } catch (Exception e) {
                        }
                    }
                }
                ).start();
(新线程(){
@凌驾
公开募捐{
试一试{
XmlPullParserFactory工厂=XmlPullParserFactory.newInstance();
XmlPullParser xpp=factory.newPullParser();
setInput(新的StringReader(“HelloWorld!”);
int eventType=xpp.getEventType();
while(eventType!=XmlPullParser.END_文档){
if(eventType==XmlPullParser.START\u文档){
System.out.println(“开始文档”);
}else if(eventType==XmlPullParser.START_标记){
System.out.println(“开始标记”+xpp.getName());
}else if(eventType==XmlPullParser.END_标记){
System.out.println(“结束标记”+xpp.getName());
}else if(eventType==XmlPullParser.TEXT){
System.out.println(“Text”+xpp.getText());
}
eventType=xpp.next();
}
系统输出打印项次(“结束文件”);
}捕获(例外e){
}
}
}
).start();

它只是返回一个新创建的实例;没有机会在那里得到零。请将
Log.wtf(“PullParser”,e)
添加到catch子句并发布结果。报告的异常是NullPointerException。在我的问题中添加了跟踪报告。希望这就是你想要的。我是在日志中找到的堆栈跟踪之后记录异常的,就像我建议的那样。不是整个线程转储,它与异常本身无关。尝试在设备上运行它,它似乎工作正常。这个问题一定与XmlPullParser不能从单元测试中工作有关?
                (new Thread() {
                    @Override
                    public void run() {
                        try {
                            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                            XmlPullParser xpp = factory.newPullParser();

                            xpp.setInput(new StringReader("<foo>Hello World!</foo>"));
                            int eventType = xpp.getEventType();
                            while (eventType != XmlPullParser.END_DOCUMENT) {
                                if (eventType == XmlPullParser.START_DOCUMENT) {
                                    System.out.println("Start document");
                                } else if (eventType == XmlPullParser.START_TAG) {
                                    System.out.println("Start tag " + xpp.getName());
                                } else if (eventType == XmlPullParser.END_TAG) {
                                    System.out.println("End tag " + xpp.getName());
                                } else if (eventType == XmlPullParser.TEXT) {
                                    System.out.println("Text " + xpp.getText());
                                }
                                eventType = xpp.next();
                            }
                            System.out.println("End document");
                        } catch (Exception e) {
                        }
                    }
                }
                ).start();