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();