Challenge - 5 Problems
ViewModel Testing Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ ui_behavior
intermediate2:00remaining
What is the output when LiveData is observed in a ViewModel test?
Given a ViewModel with a LiveData that emits a value, what will the observer receive after the value is set?
Android Kotlin
class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data fun updateData(value: String) { _data.value = value } } // In test: val viewModel = MyViewModel() var observedValue: String? = null viewModel.data.observeForever { observedValue = it } viewModel.updateData("Hello")
Attempts:
2 left
💡 Hint
LiveData notifies observers immediately when value changes.
✗ Incorrect
When updateData sets _data.value to "Hello", the observer receives this new value immediately, so observedValue becomes "Hello".
❓ lifecycle
intermediate2:00remaining
What happens if you observe LiveData without a LifecycleOwner in a ViewModel test?
In a ViewModel test, what is the effect of calling observeForever on LiveData instead of observe with a LifecycleOwner?
Android Kotlin
val liveData = MutableLiveData<Int>()
liveData.observeForever { println(it) }
liveData.value = 5Attempts:
2 left
💡 Hint
observeForever does not depend on lifecycle state.
✗ Incorrect
observeForever registers a permanent observer that receives updates immediately regardless of lifecycle state.
🔧 Debug
advanced2:30remaining
Why does this ViewModel test fail to observe LiveData updates?
Consider this test code snippet. Why does observedValue remain null after updateData is called?
Android Kotlin
class MyViewModel : ViewModel() { private val _data = MutableLiveData<String>() val data: LiveData<String> = _data fun updateData(value: String) { _data.value = value } } // Test code: val viewModel = MyViewModel() var observedValue: String? = null viewModel.data.observe { observedValue = it } viewModel.updateData("Test")
Attempts:
2 left
💡 Hint
observe needs a lifecycle to work properly in tests.
✗ Incorrect
The observe method requires a LifecycleOwner to register the observer. Without it, the observer is not active and does not receive updates.
🧠 Conceptual
advanced2:30remaining
What is the main benefit of using a TestCoroutineDispatcher in ViewModel testing?
Why do we use TestCoroutineDispatcher or similar in ViewModel tests that use coroutines?
Attempts:
2 left
💡 Hint
Think about how to make asynchronous code run predictably in tests.
✗ Incorrect
TestCoroutineDispatcher lets tests control when coroutines run and complete, making tests reliable and deterministic.
📝 Syntax
expert3:00remaining
What error does this ViewModel test code produce?
Analyze the following test code snippet. What error will it raise when run?
Android Kotlin
class MyViewModel : ViewModel() { private val _count = MutableLiveData<Int>() val count: LiveData<Int> = _count fun increment() { _count.value = (_count.value ?: 0) + 1 } } // Test code: val viewModel = MyViewModel() var observedCount: Int? = null viewModel.count.observeForever { observedCount = it } viewModel.increment() viewModel.increment()
Attempts:
2 left
💡 Hint
Check how the Elvis operator ?: handles null values.
✗ Incorrect
The code uses (_count.value ?: 0) + 1, so if _count.value is null, it uses 0. No NullPointerException occurs. After two increments, observedCount is 2.