简体   繁体   English

如何测试 LiveData Android 的 getter、setter 方法?

[英]How to test getter, setter method of a LiveData Android?

I am using Hilt for DI in my project.我在我的项目中使用 Hilt for DI。 I am trying write unit test cases for LiveData object, but it's not coming under coverage.我正在尝试为 LiveData object 编写单元测试用例,但它不在覆盖范围内。

ViewModel视图模型

@HiltViewModel
class HealthDiagnosticsViewModel @Inject constructor(
    private var networkHelper: NetworkHelper
) : ViewModel() {

    var result = MutableLiveData<Int>()

    .....

}

My unit test class is as below:我的单元测试 class 如下:

HealthViewModelTest HealthViewModel测试

@HiltAndroidTest
@RunWith(RobolectricTestRunner::class)
@Config(application = HiltTestApplication::class)
class HealthDiagnosticsViewModelTest{

    @get:Rule
    var hiltRule = HiltAndroidRule(this)

    @Inject
    lateinit var networkHelper: NetworkHelper

    lateinit var healthDiagnosticsViewModel: HealthDiagnosticsViewModel

    @Before
    fun setUp() {
        hiltRule.inject()
        healthDiagnosticsViewModel = HealthDiagnosticsViewModel(networkHelper)
    }

    @Test
    fun testGetResult() {
        val result = healthDiagnosticsViewModel.result.value
        Assert.assertEquals(null, result)
    }

    @Test
    fun testSetResult() {
        healthDiagnosticsViewModel.result.value = 1
        Assert.assertEquals(1, healthDiagnosticsViewModel.result.value)
    }
}

Test Cases are passed but it's not coming under method coverage.测试用例已通过,但不在方法覆盖范围内。

I'll share with you the an example of my code that would solve your problem.我将与您分享我的代码示例,它可以解决您的问题。

I'm usnig ViewModel with Dagger Hilt我使用Dagger HiltViewModel

  1. You don't have to use Robelectric, you can use MockK library .你不必使用 Robelectric,你可以使用MockK 库

  2. Replace your HiltRule with this Rule:将您的 HiltRule 替换为此规则:

    @get:Rule @get:规则

    var rule: TestRule = InstantTaskExecutorRule() var 规则:TestRule = InstantTaskExecutorRule()

  3. This is my ViewModel class这是我的 ViewModel class

using MockK, you can mock the.networkHelper class without Hilt.使用 MockK,您可以在没有 Hilt 的情况下模拟 .networkHelper class。 So, your setup method will be like that:因此,您的设置方法将是这样的:

lateinit var networkHelper: NetworkHelper
......
......
......
@Before
fun setUp() {
    networkHelper = mockk<NetworkHelper>()
    healthDiagnosticsViewModel = HealthDiagnosticsViewModel(networkHelper)
}

4)The most important part in your test is to Observe to the LiveData first . 4)测试中最重要的部分是首先观察 LiveData

@Test
fun testGetResult() {
    healthDiagnosticsViewModel.result.observeForever {}
    val result = healthDiagnosticsViewModel.result.value
    Assert.assertEquals(null, result)
}

You can observe to the livedata for each unit test, but keep in mind to Observe first before change data.您可以观察每个单元测试的实时数据,但请记住在更改数据之前先观察

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM