以下代码实验室在不使用 Robolectric 或任何模拟库的情况下在单元测试中实例化一个
ViewModel
。
https://developer.android.com/codelabs/basic-android-kotlin-compose-test-viewmodel
这怎么可能?我以为
ViewModel
是 Android 库的一部分,不会在 JVM 中运行。
ViewModel
只是一个类,它确实是Android SDK的一部分。但是,如果有可用的公共构造函数,您实际上不需要任何特定的 Android 机制来创建它的实例。
这个构造函数实际上是用来在测试类中实例化一个ViewModel。它在 JVM 上运行的原因是 JVM 能够编译和运行 Kotlin 代码。
Plain JVM 确实无法管理和正确创建 Android 应用程序组件(如
Activity
),因此它们通常在测试中被模拟。然而 ViewModel
在代码实验室中不需要任何 Android 特定组件的实例进行测试。
这怎么可能?
ViewModel 和其他类一样是一个 Java 类。因此它的一个实例可以像任何其他实例一样实例化。
我认为作为 Android 库的一部分的 ViewModel 不会在 JVM 中运行。
ViewModel
实际上不是“Android 库的一部分”——它是JetPack
生命周期组件库 的一部分。这些是对 - 但not - 核心 Android 框架的扩展。您可以从 ViewModel 源代码 中看到,基 ViewModel
类不依赖于核心 Android 框架类 - 只有其他 JetPack
类和标准 Java
类。
因此,您不需要存在 Android 运行时即可使用
ViewModel
这意味着您可以在本地单元测试 JVM 上运行它。