I'm writing some test case with coroutine
class ArticleViewModel : ViewModel() {
private var likeCount = 0
fun getLikeCount() = likeCount
fun addLikeCount() {
viewModelScope.launch {
likeCount += 1
likeCount
}
}
}
@ExperimentalCoroutinesApi
private fun MainCoroutineRule.runBlockingTest(block: suspend () -> Unit) =
this.testDispatcher.runBlockingTest {
block()
}
@ExperimentalCoroutinesApi
class MainCoroutineRule(
val testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()
) : TestWatcher() {
override fun starting(description: Description?) {
super.starting(description)
Dispatchers.setMain(testDispatcher)
}
override fun finished(description: Description?) {
super.finished(description)
Dispatchers.resetMain()
testDispatcher.cleanupTestCoroutines()
}
}
@ExperimentalCoroutinesApi
class ArticleViewModelTest {
@get:Rule
var mainCoroutineRule = MainCoroutineRule()
@Test
fun addLikeCount() = mainCoroutineRule.runBlockingTest {
val articleViewModel = ArticleViewModel()
articleViewModel.addLikeCount()
Assert.assertEquals(1, articleViewModel.getLikeCount())
}
}
addLikeCount() test case above is working fine until I try to change logic addLikeCount().
case 1:
fun addLikeCount() {
viewModelScope.launch {
delay(2000)
likeCount += 1
likeCount
}
}
case 2:
fun addLikeCount() {
viewModelScope.launch {
withTimeout(2000) {
likeCount += 1
likeCount
}
}
}
I want to delay 2 second (example: call API), then continuing handle logic (likeCount += 1, ....).
In case 1, addLikeCount() test case is fail
In case 2, addLikeCount() test case is pass
I don't know why? what is difference between delay vs withTimeout? If you understand my problem, please help me. Thank you so much.
Aucun commentaire:
Enregistrer un commentaire