android - 让暂停功能不返回任何东西

标签 android unit-testing kotlin coroutine kotlin-coroutines

考虑此类:

class TestViewModel(private val interactor: LoginInteractor) : ViewModel() {

    private val _loading = MutableLiveData<Boolean>().apply { value = false }
    val loading: LiveData<Boolean> = _loading

    fun loginClicked() {
        viewModelScope.launch {
            _loading.value = true
            val isLoggedIn = interactor.login()
            _loading.value = false
        }
    }

}

interface LoginInteractor {
    suspend fun login(): Boolean
}

和测试:
class TestViewModelTest {

    @Rule
    @JvmField
    var rule = InstantTaskExecutorRule()

    @Mock
    private lateinit var interactor: LoginInteractor
    @InjectMocks
    private lateinit var tested: TestViewModel

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        Dispatchers.setMain(TestCoroutineDispatcher())
    }

    @Test
    fun `should set loading to true while loading`() = runBlockingTest {
        given(interactor.login()).willReturn(true)

        tested.loginClicked()

        Assert.assertTrue(tested.loading.value!!)
    }
}

断言loading的值是true时,显然不是。

当我们使用RxJava时,LoginInteractor看起来像:
interface LoginInteractor {
    fun login(): Single<Boolean>
}

在测试中,我们可以做到
given(interactor.login()).willReturn(Single.never())

在登录时测试ViewModel的状态;我如何才能延迟/不返回我的交互器的suspend函数login()的任何内容,以在调用loginClicked()interactor.login()尚未返回时测试ViewModel的状态?

最佳答案

选项1:

为了保证您的状态已更改,您可以订阅加载状态更改:

@Test
 fun `should set loading to true while loading`() = runBlockingTest {
     given(interactor.login()).willReturn(true)

     var invocationCounter = 0
     tested.loading.observerForever { loading -> 
         assertEquals(invocationCounter == 0, loading)
         invocationCounter++
     }

     tested.loginClicked()

     Assert.assertTrue(tested.loading.value!!)
 }


选项2:
   ```
     given(interactor.login()).willAnswer {
         assertTrue(tested.loading.value)
         true
    }

    tested.loginClicked()

    Assert.assertFalse(tested.loading.value!!)

关于android - 让暂停功能不返回任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59935468/

相关文章:

java - 如何在启动新应用程序时启动服务?

PHP ZF2 单元测试调度方法非常慢

java - Vert.x中的setHandler/map/composite有什么区别

kotlin - 使用参数化函数实现接口(interface)

android - 如何获取GCM API Key,菜单中没有已注册的应用程序

android - 无法从 Android 连接到 Firebird 服务器

java - 如何查找 native java函数调用的源代码

python-3.x - 在databricks中,在不同笔记本中的函数上使用unittest.mock.patch

ruby-on-rails - 如何向已完成的 Rails 应用程序添加测试?

kotlin - 我如何在惯用的Kotlin中 “wrap”这个不太好的-“by lazy”结果缓存函数调用?