如何对仅调用不返回任何内容的依赖函数的函数进行单元测试?

时间:2019-06-10 10:11:17

标签: android unit-testing kotlin android-architecture-components mockk

我在如何对视图模型功能进行单元测试时遇到问题。

class MyViewModel(
    private val dependency: Dependency
) : ViewModel() {
    private val _myFunctionState = MutableLiveData<State>()
    val myFunctionState: LiveData<State> = _myFunctionState   

    fun myFunction() {
        viewModelScope.launch(CoroutineExceptionHandler { _, throwable -> 
            _myFunctionState.postValue(State.Error(throwable)
        }) {
            _myFunctionState.postValue(State.Loading)
            dependency.callFunction()
            _myFunctionState.postValue(State.Success)
        }
    }
}

现在,如果dependency.callFunction()返回某个值,我可以轻松地测试是否获得了值并执行类似liveData.value shouldBe valueFromFunction的断言,但是在这种情况下,该函数只是执行某些操作

我已经考虑过使用验证进行测试

fun test_myFunction() {
    val dependency = mockk<Dependency>(relaxed = true)
    val viewModel = MyViewModel(dependency)

    viewModel.myFunction()

    coVerify { dependency.callFunction() }
    confirmVerified(dependency)
}

但是,如果我走这条路,这已经在测试实现细节。我应该测试行为,所以我决定测试状态

fun test_myFunction() {
    val dependency = mockk<Dependency>(relaxed = true)
    val viewModel = MyViewModel(dependency)

    viewModel.myFunction()

    viewModel.myFunctionState.value shouldBe State.Success
}

由于这是一个协程,执行将在dependency.callFunction()处停止,并且只有在成功的情况下才恢复并发出State。现在,这将测试行为,但是,如果开发人员删除了依赖项调用该怎么办?现在测试仍然可以通过而无需调用依赖项。

我应该继续测试实施并验证依赖项调用吗?还是我应该跳过此测试?

非常感谢!

0 个答案:

没有答案