I’m working on an Android project that uses Type Safety Compose Navigation (androidx.navigation:navigation-compose:2.8.0-beta05). I’m trying to create a test to verify a value passed through SavedStateHandle.
See my code:
<code>// Screen.kt
@Serializable
sealed class Screen {
@Serializable
data class Details(
val movieId: Int,
) : Screen()
}
</code>
<code>// Screen.kt
@Serializable
sealed class Screen {
@Serializable
data class Details(
val movieId: Int,
) : Screen()
}
</code>
// Screen.kt
@Serializable
sealed class Screen {
@Serializable
data class Details(
val movieId: Int,
) : Screen()
}
<code>// DetailsViewModel.kt
import androidx.navigation.toRoute
import com.paulohc.movlist.navigation.Screen
class DetailsViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
) : ViewModel() {
val movieId: Int = savedStateHandle.toRoute<Screen.Details>().movieId
}
</code>
<code>// DetailsViewModel.kt
import androidx.navigation.toRoute
import com.paulohc.movlist.navigation.Screen
class DetailsViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
) : ViewModel() {
val movieId: Int = savedStateHandle.toRoute<Screen.Details>().movieId
}
</code>
// DetailsViewModel.kt
import androidx.navigation.toRoute
import com.paulohc.movlist.navigation.Screen
class DetailsViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
) : ViewModel() {
val movieId: Int = savedStateHandle.toRoute<Screen.Details>().movieId
}
I tried the following test:
<code>// DetailsViewModelTest.kt
class DetailsViewModelTest {
private lateinit var detailsViewModel: DetailsViewModel
@BeforeEach
fun setup() {
val savedState = SavedStateHandle(mapOf("movieId" to 10))
detailsViewModel = DetailsViewModel(savedState)
}
@Test
fun getState() {
assertThat(detailsViewModel.movieId).isEqualTo(10)
}
}
</code>
<code>// DetailsViewModelTest.kt
class DetailsViewModelTest {
private lateinit var detailsViewModel: DetailsViewModel
@BeforeEach
fun setup() {
val savedState = SavedStateHandle(mapOf("movieId" to 10))
detailsViewModel = DetailsViewModel(savedState)
}
@Test
fun getState() {
assertThat(detailsViewModel.movieId).isEqualTo(10)
}
}
</code>
// DetailsViewModelTest.kt
class DetailsViewModelTest {
private lateinit var detailsViewModel: DetailsViewModel
@BeforeEach
fun setup() {
val savedState = SavedStateHandle(mapOf("movieId" to 10))
detailsViewModel = DetailsViewModel(savedState)
}
@Test
fun getState() {
assertThat(detailsViewModel.movieId).isEqualTo(10)
}
}
But I am encountering the following error:
<code>Method putInt in android.os.BaseBundle not mocked. See https://developer.android.com/r/studio-ui/build/not-mocked for details.
java.lang.RuntimeException: Method putInt in android.os.BaseBundle not mocked. See https://developer.android.com/r/studio-ui/build/not-mocked for details.
</code>
<code>Method putInt in android.os.BaseBundle not mocked. See https://developer.android.com/r/studio-ui/build/not-mocked for details.
java.lang.RuntimeException: Method putInt in android.os.BaseBundle not mocked. See https://developer.android.com/r/studio-ui/build/not-mocked for details.
</code>
Method putInt in android.os.BaseBundle not mocked. See https://developer.android.com/r/studio-ui/build/not-mocked for details.
java.lang.RuntimeException: Method putInt in android.os.BaseBundle not mocked. See https://developer.android.com/r/studio-ui/build/not-mocked for details.
How can I rewrite this test to pass correctly? Can I mock the ´savedStateHandle´ with mockk?
New contributor
Paulo Henrique is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.