Vibhuti
Vibhuti

Reputation: 704

Mockito - mocked class variable is null

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

Answers (1)

Santanu Sur
Santanu Sur

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

Related Questions