Reputation: 704
I have created a sample project with Mockk and I am having a viewModel and a dependency class Repository
class DefaultUserRepository:UserRepository {
val listOfUser =ArrayList<User>()
override fun insertUser(user: User):User {
listOfUser.add(user)
return user
}
override fun deleteUser(user: User) {
listOfUser.remove(user)
}
override fun updateUser(user: User) {
//listOfUser.repl
}
override fun getAlltUser():ArrayList<User> {
return listOfUser
}
}
Viewmodel :-
class ViewModelTest {
lateinit var repository: DefaultUserRepository
lateinit var viewModel: ViewModel
@Before
fun setUp() {
repository = spyk(DefaultUserRepository())
viewModel = ViewModel(repository)
}
@Test
fun `test insert user successful`(){
// every { viewModel.insertUser(any()) } returns User(1,"abc","abc")
// every { viewModel.getAllsers() } returns repository.listOfUser
val user = User(1,"abc","abc")
viewModel.insertUser(user)
verify { viewModel.insertUser(user) }
val user2 = User(2,"abc","abc")
viewModel.insertUser(user2)
verify { viewModel.insertUser(user) }
val getAllUsers = viewModel.getAllsers()
assertEquals(getAllUsers.size,2)
}
}
The thing is when i debug my test, the listOfuser is showing null even after calling insert though my test passes. Why does that happen?
Upvotes: 1
Views: 714
Reputation: 11477
Annotation @RelaxedMockk
means mockk
would definitely ignore the functions with Unit
return type.
So if u change the following in the test class :-|
@RelaxedMockk
lateinit var repository: DefaultUserRepository
to
@Mockk
lateinit var repository: DefaultUserRepository
then the test class would not pass saying
No answer found for DefaultUserRepository.insert(..).
Solution
I would suggest to use spyk(DefaultUserRepository())
for your case:-
lateinit var repository: DefaultUserRepository
....
@Before
fun setUp() {
repository = spyk(DefaultUserRepository())
viewModel = ViewModel(repository)
}
So repository
instance would be real repository and now when u debug u would find that listOfUser
is not null.
Upvotes: 1