Как только эта строка будет вызвана:
// CityListViewModelTest
val result = viewModel.getCities(0.0,0.0)
CityListViewModel
подпишется на forecastRepo.getCities()
, поэтому имеет смысл, что verify(repository).getCities(0.0,0.0)
проходит.
Однако это не такгарантируется, что forecastRepo.getCache()
будет вызван раньше verify(repository).getCache()
, потому что forecastRepo.getCities()
работает в отдельном потоке.В вашем тестовом коде вам нужно использовать TestSchedulers для ожидания завершения операции в планировщике io.
Примечание:
Кажется, .observeOn(AndroidSchedulers.mainThread())
в ViewModels не делаетздесь не так много, потому что ViewModels не зависят от жизненных циклов Android.Вместо setValue()
вы можете использовать postValue()
для обновления MutableLiveData
из фонового потока.
Обновление:
Попробуйте использовать это:
@Rule
@JvmField
val rule = InstantTaskExecutorRule()
@Mock
lateinit var observer: Observer<List<City>>
@Test
fun getCities() {
val response = getMockedCities(5)
`when`(repository.getCities(ArgumentMatchers.anyDouble(), ArgumentMatchers.anyDouble()))
.thenReturn(Single.just(response))
viewModel.getCities(0.0,0.0).observeForever(observer)
verify(repository).getCities(0.0,0.0)
verify(repository).getCache()
// assertEquals(response.list,result.value) //result.value should be a list of 5 mocked cities but is null
verify(observer).onChanged(reponse.list)
}
Также могут быть проблемы с getCache()
и getCache().saveCities()
.Попытайтесь смоделировать их, если приведенный выше код не работает.