我一直在跟踪guide,了解如何在kotlin中正确使用视图模型,并希望确保对所有内容进行单元测试。
这里是视图模型工厂,它吸收了一个创建者
class BaseViewModelFactory<T>(val creator: () -> T) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return creator() as T
}
}
这是我用来调用工厂并将其传递给其视图模型的扩展功能。
inline fun <reified T : ViewModel> FragmentActivity.getViewModel(noinline creator: (() -> T)? = null): T {
return if (creator == null)
ViewModelProviders.of(this).get(T::class.java)
else
ViewModelProviders.of(this, BaseViewModelFactory(creator)).get(T::class.java)
}
然后在一个活动中,我使用扩展功能来延迟加载视图模型。
val model: MainViewModel by lazy {
getViewModel { MainViewModel() }
}
一切正常。但是我在努力找出如何对BaseViewModelFactory和扩展功能进行单元测试。
这是我的尝试:
@RunWith(JUnit4::class)
class BaseViewModelFactoryTest {
// test string
private val testString = "testString"
@Rule @JvmField
public val activityTestRule = ActivityTestRule(MainActivity::class.java)
// a custom inner test view model for testing base view model
inner class TestViewModel: BaseViewModel() {
var test: String = ""
init {
test = testString
}
}
// lazy loads the model the same way activities do
val model: TestViewModel by lazy {
activityTestRule.activity.getViewModel { TestViewModel() }
}
@Before
fun setUp() {
}
@Test
fun view_model_loaded() {
assertEquals("The string in the model should be set",testString, model.test)
}
}
这给我一个错误
java.lang.IllegalStateException: No instrumentation registered! Must run under a registering instrumentation.
据我了解,ActivityTestRule仅可用于AndroidTests,因为它需要一种工具才能工作。
我的问题是不确定如何正确地对扩展功能或视图模型工厂进行正确的单元测试。
有人可以帮助我为这两件事正确地编写测试吗。