BRDroid
BRDroid

Reputation: 4388

How can I test live data object in Android MVVM

Hi I am trying to test livedata which is in my viewmodel, I have written to test to verify that the repository call has been made

how can I check if the live data object in this case, and what additional test cases I should be writing for this code in viewModel

Thanks R

MainActivityViewModel

class MainActivityViewModel @Inject constructor(
    private val dataRepository: DataRepository
): ViewModel() {
    val _charactersLiveData = MutableLiveData<Result<ArrayList<Character>>>()
    val charactersLiveData: LiveData<Result<ArrayList<Character>>> = _charactersLiveData

    fun fetchCharacters() {
        viewModelScope.launch {
            _charactersLiveData.value = dataRepository.getCharacters()
        }
    }
}

MainActivityViewModelTest

@RunWith(MockitoJUnitRunner::class)
class MainActivityViewModelTest {

    @get:Rule
    val coroutineRule = MainCoroutineRule()

    @Mock
    private lateinit var dataRepository: DataRepository

    @InjectMocks
    private lateinit var mainActivityViewModel: MainActivityViewModel

    @Test
    fun fetchCharacters() {
        runBlockingTest {
            mainActivityViewModel.fetchCharacters()
            verify(dataRepository).getCharacters()
        }
    }
}

Upvotes: 2

Views: 7709

Answers (2)

Umesh Yadav
Umesh Yadav

Reputation: 1200

Try this if any issues then let me know. I have try to do according to your class and data but if you need then can changes.

@RunWith(MockitoJUnitRunner::class)
class MainActivityViewModelTest {

@get:Rule
val coroutineRule = MainCoroutineRule()

@Mock
private lateinit var dataRepository: DataRepository

@InjectMocks
private lateinit var mainActivityViewModel: MainActivityViewModel

@Mock
private lateinit var dataObserver:  Observer<Result<List<Character>>>

@Test
fun fetchCharacters() {
    runBlockingTest {
        Mockito.`when`(datarepository).getcharacter()
        .thenreturn(Result.success(listOf(Character (
        Name=A,
        Type=hero))))
mainActivityViewModel.fetchCharacters()
mainActivityViewModel.charactersLiveData.observeForever(dataObserver)
Mockito.verify(dataRepository).getCharacters()
Mockito.verify(dataObserver).onChanged(Result.success(listOf(Character (
  Name=A,
  Type=hero))))
mainActivityViewModel.charactersLiveData.removeObserver(dataObserver)
            }
        }

}

Upvotes: 1

hientp
hientp

Reputation: 834

You can reference this article: https://medium.com/androiddevelopers/unit-testing-livedata-and-other-common-observability-problems-bb477262eb04

The main idea here is:

  • Mock dataRepository
  • When dataRepository calls getCharacters(), it should return the testing value. E.g. listOf('a')
  • Execute mainActivityViewModel.fetchCharacters()
  • Expect the value of your live data
assertEquals(mainActivityViewModel.charactersLiveData.getOrAwaitValue(), listOf('a'))

Upvotes: 3

Related Questions