单元测试时出现“未嘲笑XmlPullParserFactory”问题

rem*_*til 3 java android unit-testing xstream mockito

我正在做一个单元测试,其中包括使用XStream解析器解析数据。我使用Mockito来模拟上下文,但是测试用例失败并显示错误日志:

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 com.thoughtworks.xstream.io.xml.XppDriver.createParser(XppDriver.java:57)
at com.thoughtworks.xstream.io.xml.AbstractXppDriver.createReader(AbstractXppDriver.java:54)
at com.thoughtworks.xstream.io.xml.AbstractXppDriver.createReader(AbstractXppDriver.java:65)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1049)
at com.att.apis.metadata.MetadataHandler.execute(MetadataHandler.java:38)
at com.att.apis.services.ServerOperations.executePostOperation(ServerOperations.java:20)
at com.att.framework.helper.request.MetadataAPIHandler.executeAPIRequest(MetadataAPIHandler.java:58)
at com.att.framework.helper.request.MetadataAPIHandlerMokitoTest.executeAPIRequest(MetadataAPIHandlerMokitoTest.java:57)
Run Code Online (Sandbox Code Playgroud)

错误在以下代码块中的行“ response =(MetadataResponse)xs.fromXML(iStream);”处发生

InputStream iStream = responseData.getInputStream();
        XStream xs = new XStream();
        xs.autodetectAnnotations(true);
        xs.alias("helloa", A.class);
        xs.alias("hellob", B.class);
        xs.alias("helloc",C.class);
        response =  (MetadataResponse)xs.fromXML(iStream);
Run Code Online (Sandbox Code Playgroud)

按照Android的答案:XmlPullParserFactory.newInstance()创建一个空工厂,我添加了

testOptions {
    unitTests.returnDefaultValues = true
}
Run Code Online (Sandbox Code Playgroud)

在build.gradle中。

更新后,出现带有以下日志的NullPointer异常。

java.lang.NullPointerException
at com.thoughtworks.xstream.io.xml.XppDriver.createParser(XppDriver.java:59)
at com.thoughtworks.xstream.io.xml.AbstractXppDriver.createReader(AbstractXppDriver.java:54)
at com.thoughtworks.xstream.io.xml.AbstractXppDriver.createReader(AbstractXppDriver.java:65)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1049)
at com.att.apis.metadata.MetadataHandler.execute(MetadataHandler.java:38)
at com.att.apis.services.ServerOperations.executePostOperation(ServerOperations.java:20)
at com.att.framework.helper.request.MetadataAPIHandler.executeAPIRequest(MetadataAPIHandler.java:58)
at com.att.framework.helper.request.MetadataAPIHandlerMokitoTest.executeAPIRequest(MetadataAPIHandlerMokitoTest.java:57)
Run Code Online (Sandbox Code Playgroud)

谁能帮我解决问题

Ced*_*zar 5

如果您认为模拟XmlPullParser不是一个好主意,而宁愿针对真正的解析器编写测试,那么您可以检查代码是否真正正确地解析了真正的XML文档,这是解决问题的方法:

只需将此xmlpull依赖项添加到应用程序的gradle文件中即可:

testImplementation group: 'xmlpull', name: 'xmlpull', version: '1.1.3.1' 
Run Code Online (Sandbox Code Playgroud)

它仅用于运行单元测试,不会打包在您的APK中

  • 对于Android API级别28,我必须使用`testImplementation'net.sf.kxml:kxml2:2.3.0'` (4认同)
  • @HeathBorders 你的建议确实有帮助。我遇到了一个不同的错误,在我们提取 PayPal SDK 后,特定于 xml 的测试失败,添加 `testImplementation 'net.sf.kxml:kxml2:2.3.0'` 的建议是解决该问题的唯一方法。 (3认同)
  • `testImplementation 'xmlpull:xmlpull:1.1.3.1'` 比使用 `group`、`name`、version` 标签更惯用 (2认同)

Ale*_*tin 3

XmlPullParserFactory来自 Android 平台,因此不能在单元测试中进行模拟,因为它们是使用您计算机上安装的 Java VM 执行的。

您可能想要使用Robolectric框架,它允许单元测试调用 Android 平台(它模拟整个平台中的几乎所有内容)