我正试图通过编写一些单元测试来测试我的viewmodel
。我的问题是,如果不手动设置MutableLiveData的一些值(在生产中,这些值是通过数据绑定设置的(,我就无法实现我的目标。这里的问题是,我的MutableLiveData(显然(是private
,因此我不能通过在单元测试中写入mutablelivedata.value = "Some Value"
来设置值。
我读过一些文章,有些人说我应该通过编写一个自定义设置程序来公开我的MutableLiveData,比如:
private val _myMutableLiveData = MutableLiveData<String>()
val myPublicLiveData: LiveData<String> get() = _myMutableLiveData
// setter
fun setStringForLiveData(value: String) {
_myMutableLiveData.value = value
}
我的问题来了:将MutableLiveData设置为private
,但用自定义setStringForLiveData(value: String)
公开setter,用myPublicLiveData
公开getter,这有什么意义。我的意思是,当我公开private
字段的getter和setter时,为什么不应该公开它呢?
这是我目前测试MutableLiveData的方法(我不知道这是否有意义,甚至是否有效(
@Test
fun `first shipping text should be set correctly`() {
(viewModel.secondDropDownVisibility as MutableLiveData<Boolean>).value = false
(viewModel.shippingFirstDdText as MutableLiveData<String>).value = "Toast"
assertEquals("Toast", viewModel.decideShippingTextOne())
}
我希望有一种比为每个可变数据编写自定义setter更好的方法(我有20多个,这只是一个丑陋的样板代码(。也许我误解了什么。
请记住,我对Android开发和MVVM的概念,尤其是Livedata,还很陌生。
我感谢每一次帮助,谢谢!
好吧,这可能不是最好的答案,但这对我来说很有效;哦,不,但这在android编程中是不对的"或";但是你不应该在单元测试中这样做;。测试用例有效,这就是我所需要的。
@Test
fun `first shipping text should be set correctly`() {
(viewModel.secondDropDownVisibility as MutableLiveData<Boolean>).value = false
(viewModel.shippingFirstDdText as MutableLiveData<String>).value = "Toast"
assertEquals("Toast", viewModel.decideShippingTextOne())
}
我有两个类型为MutableLiveData<T>
的专用字段_secondDropDownVisibility
和_shippingFirstDdText
以及两个类型LiveData<T>
的公共字段secondDropDownVisibility
和shippingFirstDdText
干杯
如果您需要从外部修改MutableLiveData,您应该直接将其公开(不需要对方法进行任何额外的保证(。
如果您一直在使用Databinding,那么您将公开ObservableField,它也是可读写的。
private val _myMutableLiveData = MutableLiveData<String>()
val myPublicLiveData: LiveData<String> get() = _myMutableLiveData
// setter
fun setStringForLiveData(value: String) {
_myMutableLiveData.value = value
}
很抱歉,这个代码没有意义。如果您绝对需要这样做,那么就不需要使用双字段,因为您无论如何都要公开可变状态。
也就是说,我认为你需要求助于这个,它通常是一种代码气味。我看不到你的整个视图模型,但我假设你有一个公共函数(或一些init代码(,它会触发一些工作,并将数据推送到实时数据中,这就是你必须测试的。如果你想上传你的全视图模型,我可以尝试通过更新答案来建议测试方法。干杯