Mockito - 模拟的 class 变量为空

Mockito - mocked class variable is null

我用 Mockk 创建了一个示例项目,我有一个 viewModel 和一个依赖项 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
    }

}

视图模型:-

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)

    }
}

问题是当我调试我的测试时,即使我的测试通过了调用插入,listOfuser 仍显示为 null。为什么会这样?

注释@RelaxedMockk表示mockk肯定会忽略Unit return类型的函数。

因此,如果您在测试中更改以下内容 class :-|

 @RelaxedMockk  
 lateinit var repository: DefaultUserRepository

 @Mockk  
 lateinit var repository: DefaultUserRepository

那么考试class就过不去saying

No answer found for DefaultUserRepository.insert(..).

解决方案

我建议您使用 spyk(DefaultUserRepository()):-

lateinit var repository: DefaultUserRepository
....

@Before
fun setUp() {
    repository = spyk(DefaultUserRepository())
    viewModel = ViewModel(repository)
}

所以 repository 实例将是真正的存储库,现在当你调试时你会发现 listOfUser 不为空。