【问题标题】:"XmlPullParserFactory not mocked" issue while unit testing单元测试时出现“未模拟 XmlPullParserFactory”问题
【发布时间】:2017-04-06 13:40:55
【问题描述】:

我正在做一个单元测试,其中包括使用 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)

错误发生在下面代码块中的“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);

根据Android: XmlPullParserFactory.newInstance() creating a null factory的回答,我补充了

testOptions {
    unitTests.returnDefaultValues = true
}

在 build.gradle 中。

更新后发生 NullPointer Exception with below log.

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)

谁能帮我解决这个问题

【问题讨论】:

    标签: java android unit-testing mockito xstream


    【解决方案1】:

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

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

    testImplementation group: 'xmlpull', name: 'xmlpull', version: '1.1.3.1' 
    

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

    【讨论】:

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

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

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

    【讨论】:

      【解决方案3】:

      您应该稍微重构一下您的代码并模拟Xstream 及其所有依赖项。例如,您可以将 Xstream 的创建外部化并将其传递给您的测试方法。

          Xstream mockXstream = Mockito.mock(Xstream.class);
          //mock all xstream method calls
      
          void myMethodUnderTest(Xstream xs){
                  InputStream iStream = responseData.getInputStream();
                  xs.autodetectAnnotations(true);
                  xs.alias("helloa", A.class);
                  xs.alias("hellob", B.class);
                  xs.alias("helloc",C.class);
                  response =  (MetadataResponse)xs.fromXML(iStream);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-23
        相关资源
        最近更新 更多