0

我在我的项目中使用 Hilt 进行 DI。我正在尝试为 LiveData 对象编写单元测试用例,但它没有被覆盖。

视图模型

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

    var result = MutableLiveData<Int>()

    .....

}

我的单元测试类如下:

健康视图模型测试

@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)
    }
}

测试用例已通过,但它不在方法覆盖范围内。

4

1 回答 1

0

我将与您分享一个可以解决您的问题的代码示例。

我在使用Dagger Hilt的ViewModel

  1. 您不必使用 Robelectric,您可以使用MockK 库

  2. 用此规则替换您的 HiltRule:

    @get:规则

    var 规则:TestRule = InstantTaskExecutorRule()

  3. 这是我的 ViewModel 类

使用 MockK,您可以在没有 Hilt 的情况下模拟 networkHelper 类。因此,您的设置方法将是这样的:

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

4) 测试中最重要的部分是先观察 LiveData

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

您可以观察每个单元测试的实时数据,但请记住在更改数据之前先观察。

于 2022-02-21T23:21:51.220 回答