Модульный тест должен проверять успешную загрузку данных:
- проверьте, не являются ли данные нулевыми
- проверьте, соответствует ли длина данных ожидаемой
- проверьте, верны ли первые полученные данные
- проверьте, верны ли первые полученные данные
- проверьте, не являются ли данные нулевыми
проверьте, соответствует ли длина данных ожидаемой li>
-проверьте, являются ли полученные данные нулевыми или пустыми.
здесь находится ошибка, возникшая в результате первого модульного теста, который я пытаюсь исправить.
Ошибка модульного теста p>
это модульный тест
Код: Выделить всё
@ExperimentalCoroutinesApi
@RunWith(MockitoJUnitRunner::class)
class MainViewModelTest {
@get:Rule
val instantExecutorRule = InstantTaskExecutorRule()
@get:Rule
val mainDispatcherRules = MainDispatcherRule()
@Mock
lateinit var storyRepository: UserRepository
@Test
fun `when Get Quote Should Not Null and Return Data`() = runTest {
val dummyQuote = DataDummy.generateDummyStoryResponse()
val data: PagingData = QuotePagingSource.snapshot(dummyQuote)
val expectedQuote = MutableLiveData
>()
expectedQuote.value = data
val dummyUserModel = UserModel(email = "[email protected]" , token = dummyToken, userId = "232321", name ="Charlie", isLogin = true)
val dummyFlow = flowOf(dummyUserModel)
//bug baris 50
val mainViewModel = MainViewModel(storyRepository)
Mockito.`when`(storyRepository.getSession()).thenReturn(dummyFlow)
Mockito.`when`(storyRepository.getStoriesWithPaging(dummyToken)).thenReturn(expectedQuote)
val actualQuote: PagingData = mainViewModel.stories.getOrAwaitValue()
val differ = AsyncPagingDataDiffer(
diffCallback = StoryAdapter.StoryDiffCallback(),
updateCallback = noopListUpdateCallback,
workerDispatcher = Dispatchers.Main,
)
differ.submitData(actualQuote)
Assert.assertNotNull(differ.snapshot())
Assert.assertEquals(dummyQuote.size, differ.snapshot().size)
Assert.assertEquals(dummyQuote[0], differ.snapshot()[0])
}
companion object {
private const val dummyToken =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJ1c2VyLWRlX29wd1dmN0s4QVhNSTkiLCJpYXQiOjE2NjcwNDYxMzN9._TmFRjqq3BL8R--c1mIDTB2UwaJfFDCv_kt8lxNfnMU"
}
@Test
fun `when Get Quote Empty Should Return No Data`() = runTest {
val data: PagingData = PagingData.from(emptyList())
val expectedQuote = MutableLiveData()
expectedQuote.value = data
val dummyUserModel = UserModel(email ="[email protected]" , token = dummyToken, userId = "232321", name ="Charlie", isLogin = true)
val dummyFlow = flowOf(dummyUserModel)
Mockito.`when`(storyRepository.getSession()).thenReturn(dummyFlow)
Mockito.`when`(storyRepository.getStoriesWithPaging(dummyToken)).thenReturn(expectedQuote)
val mainViewModel = MainViewModel(storyRepository)
val actualQuote: PagingData = mainViewModel.stories.getOrAwaitValue()
val differ = AsyncPagingDataDiffer(
diffCallback = StoryAdapter.StoryDiffCallback(),
updateCallback = noopListUpdateCallback,
workerDispatcher = Dispatchers.Main,
)
differ.submitData(actualQuote)
Assert.assertEquals(0, differ.snapshot().size)
}
}
class QuotePagingSource : PagingSource() {
companion object {
fun snapshot(items: List): PagingData {
return PagingData.from(items)
}
}
override fun getRefreshKey(state: PagingState): Int {
return 0
}
override suspend fun load(params: LoadParams): LoadResult {
return LoadResult.Page(emptyList(), 0, 1)
}
}
val noopListUpdateCallback = object : ListUpdateCallback {
override fun onInserted(position: Int, count: Int) {}
override fun onRemoved(position: Int, count: Int) {}
override fun onMoved(fromPosition: Int, toPosition: Int) {}
override fun onChanged(position: Int, count: Int, payload: Any?) {}
}
Код: Выделить всё
class MainViewModel(private val repository: UserRepository) : ViewModel() {
private val _stories = MutableLiveData
>()
val stories: LiveData get() = _stories
private val _isLoading = MutableLiveData()
fun getSession(): LiveData {
return repository.getSession().asLiveData()
}
private val _userToken = MediatorLiveData()
val userToken: LiveData get() = _userToken
init {
_userToken.addSource(repository.getSession().asLiveData()) { userModel ->
_userToken.value = userModel.token
}
}
fun getStory() {
userToken.observeForever { token ->
_isLoading.value = true
viewModelScope.launch {
try {
repository.getStoriesWithPaging(token).observeForever { pagingData ->
_stories.value = pagingData
}
} catch (e: Exception) {
// Tangani error jika ada
} finally {
_isLoading.value = false
}
}
}
}
fun logout() {
viewModelScope.launch {
repository.logout()
}
}
}
Я пытался исправить параметр, указанный как ненулевой, пытаясь получить токен данных из get session(), но это создает дополнительную проблему поскольку хранилище данных, которое я использую, имеет значение null, потому что оно не получило ответ на вход, возвращающий токен из API.
Подробнее здесь: https://stackoverflow.com/questions/792 ... -to-get-it