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
不为空。
我用 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
不为空。