【发布时间】:2020-01-02 12:00:39
【问题描述】:
我有一个虚拟机,例如
class CityListViewModel(private val repository: Repository) : ViewModel() {
@VisibleForTesting
val allCities: LiveData<Resource<List<City>>> =
liveData(context = viewModelScope.coroutineContext + Dispatchers.IO) {
emit(Resource.Loading())
emit(repository.getCities())
}
}
我的测试是:
@ExperimentalCoroutinesApi
class CityListViewModelTest {
@get:Rule
val rule = InstantTaskExecutorRule()
@get:Rule
val coroutineTestRule = CoroutinesTestRule()
@Test
fun `allCities should emit first loading and then a Resource#Success value`() =
runBlockingTest {
val fakeSuccessResource = Resource.Success(
listOf(
City(
1,
"UK",
"London",
Coordinates(34.5, 56.2)
)
)
)
val observer: Observer<Resource<List<City>>> = mock()
val repositoryMock: Repository = mock()
val sut =
CityListViewModel(repositoryMock)
doAnswer { fakeSuccessResource }.whenever(repositoryMock).getCities()
sut.allCities.observeForever(observer)
sut.allCities
val captor = argumentCaptor<Resource<List<City>>>()
captor.run {
verify(observer, times(2)).onChanged(capture())
assertEquals(fakeSuccessResource.data, lastValue.data)
}
}
@Test
fun `allCities should emit first loading and then a Resource#Error value`() =
runBlockingTest {
val fakeErrorResource = Resource.Error<List<City>>("Error")
val observer: Observer<Resource<List<City>>> = mock()
val repositoryMock: Repository = mock()
val sut =
CityListViewModel(repositoryMock)
doAnswer { fakeErrorResource }.whenever(repositoryMock).getCities()
sut.allCities.observeForever(observer)
sut.allCities
val captor = argumentCaptor<Resource<List<City>>>()
captor.run {
verify(observer, times(2)).onChanged(capture())
assertEquals(fakeErrorResource.data, lastValue.data)
}
}
}
我遇到的问题是测试非常不稳定:有时它们都通过,有时一个失败,但我似乎无法找出问题所在。
谢谢!
【问题讨论】:
标签: android kotlin android-testing kotlin-coroutines android-viewmodel