在 JVM 上使用 Android XmlPullParser 进行单元测试

Unit testing with Android XmlPullParser on the JVM

我正在尝试为我的应用程序设置单元测试用例。

应用程序的关键部分使用 org.xmlpull.v1.XmlPullParser 解析 XML 个文件。由于这部分是低级的、隔离的并且独立于活动、上下文、视图等,我真的很想在 JVM 上本地化它 运行,以避免必须一直插入或模拟设备。

然而,当 运行在 JVM 上运行这样的东西时:

XmlPullParser parser = Xml.newPullParser();
parser.setInput(in, null);
...

我得到了著名的:

Exception in thread "main" java.lang.RuntimeException: Stub!
    at android.util.Xml.newPullParser(Xml.java:15)
    ...

有办法解决这个问题吗?

我设法通过使用 Robolectric in Android-Studio. I followed this tutorial, and stumbled upon 解决了这个问题。

现在它工作正常,除了 当 运行 测试时。

就像之前的评论一样,我认为 Robolectric 是正确的选择。

我认为代码示例可能会受到欢迎,所以这是我的:

添加对你的依赖 build.gradle : 如果您使用 android 支持库:testImplementation 'org.robolectric:robolectric:3.8'(AndroidX 从 4.0 开始)

其他版本:https://mvnrepository.com/artifact/org.robolectric/robolectric

然后在测试中:(顺便说一句,这是 Kotlin)

@RunWith(RobolectricTestRunner::class)
class XmlParserRelTest {
  private lateinit var xmlParserClass : XmlParserClass 

  @Before
  internal fun setUp() {
      xmlParserClass = XmlParserRel(Xml.newPullParser())
  }

  @Test
  fun validFile_parseRelFile_contentIsPresent() {
      val inputStream = getFileInputStream("test.xml")

      val xmlOutput = xmlParserClass.parseRelFile(inputStream )
    
      assertThat(xmlOutput.attribute1).isEqualTo("something")
  }
}