12

I have a ViewModel class as below (simplified to demonstrate the problem I faced)

class MyViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
    init {
        savedStateHandle.set(KEY, "Something")
    }
}

I have a MockK testing class as below

@Test
fun `test something simple`() {
    val savedStateHandle = mockk<SavedStateHandle>()
    val viewModel = MyViewModel(savedStateHandle)
    verify { savedStateHandle.set(MyViewModel.KEY, "Something") }
}

By running the test I get the below error

io.mockk.MockKException: no answer found for: SavedStateHandle(#1).set(Key, Something)

I guess I need to handle the set for SavedStateHandle as well. How could I do so in MockK?

Elye
  • 53,639
  • 54
  • 212
  • 474

1 Answers1

38

Looks like I need to relaxed = true to my Mock, to make it just return a default value.

@Test
fun `test something simple`() {
    val savedStateHandle = mockk<SavedStateHandle>(relaxed = true)
    val viewModel = MyViewModel(savedStateHandle)
    verify { savedStateHandle.set(MyViewModel.KEY, "Something") }
}

The other option is to mock the return value...

@Test
fun `test something simple`() {
    val savedStateHandle = mockk<SavedStateHandle>()
    every {savedStateHandle.set(MyViewModel.KEY, "Something") } returns Unit
    val viewModel = MyViewModel(savedStateHandle)
    verify { savedStateHandle.set(MyViewModel.KEY, "Something") }
}
Elye
  • 53,639
  • 54
  • 212
  • 474
  • 5
    With first solution I got: `java.lang.ClassCastException: class java.lang.Object cannot be cast to class Something (java.lang.Object is in module java.base of loader 'bootstrap'; Something is in unnamed module of loader 'app')` ;;;;; and with the second solution I got: `io.mockk.MockKException: no answer found for: SavedStateHandle(#1).get(Something)` – Dr.jacky Feb 13 '21 at 21:22