Android 模拟方法未从测试局部变量返回值
我已经编写了一个测试来检查我从userdata首选项方法中添加和减去硬币的方法是否正常工作。我模拟了SharedReferences类,使用了一个存储硬币数量的局部变量Android 模拟方法未从测试局部变量返回值,android,unit-testing,mockito,kotlin,Android,Unit Testing,Mockito,Kotlin,我已经编写了一个测试来检查我从userdata首选项方法中添加和减去硬币的方法是否正常工作。我模拟了SharedReferences类,使用了一个存储硬币数量的局部变量coins 但是,模拟的getInt()似乎没有返回正确的硬币值: 运行测试addCoinValid失败(预期为5,实际为0)。在测试期间,我做了两个输出: 变量:1-mockedReturn:0 变量:5-mockedReturn:0 左边的数字是变量的值,右边的数字是模拟的getInt()返回的值 谁能告诉我发生了什么事吗O
coins
但是,模拟的getInt()似乎没有返回正确的硬币值:
运行测试addCoinValid失败(预期为5,实际为0)。在测试期间,我做了两个输出:
变量:1-mockedReturn:0变量:5-mockedReturn:0 左边的数字是变量的值,右边的数字是模拟的getInt()返回的值 谁能告诉我发生了什么事吗O
这是我的测试:
class UserDataTest {
var coins = 0
val editor = mock<SharedPreferences.Editor>()
val sharedPrefs = mock<SharedPreferences> {
on{ getInt("coins", 0) } doReturn coins
on { edit() } doReturn editor
}
val context = mock<Context> {
on { getSharedPreferences("userdata", 0) } doReturn sharedPrefs
}
val userData = UserData(context)
@Before
fun initEditorMock() {
whenever(editor.clear()).thenReturn(editor)
whenever(editor.putInt(eq("coins"), any<Int>())).thenAnswer{ invocation ->
this.coins = invocation.getArgument(1)
return@thenAnswer editor
}
}
@Test
fun addCoinValid() {
userData.setCoins(1)
println("variable: "+coins+" - mockedReturn: "+userData.getCoins())
userData.addCoins(5)
println("variable: "+coins+" - mockedReturn: "+userData.getCoins())
assertEquals(5, userData.getCoins())
}
// ...
}
类UserDataTest{
var=0
val editor=mock()
val sharedPrefs=mock{
关于{getInt(“硬币”,0)}多雷图恩硬币
关于{edit()}doReturn编辑器
}
val context=mock{
在{getSharedReferences(“userdata”,0)}doReturn SharedRefers上
}
val userData=userData(上下文)
@以前
有趣的initEditorMock(){
无论何时(editor.clear())。然后返回(editor)
无论何时(editor.putin(eq(“coins”),any())。然后回答{invocation->
this.coins=invocation.getArgument(1)
return@thenAnswer编辑
}
}
@试验
fun addCoinValid(){
userData.setCoins(1)
println(“变量:“+coins+”-mockedReturn:+userData.getCoins())
userData.addCoins(5)
println(“变量:“+coins+”-mockedReturn:+userData.getCoins())
assertEquals(5,userData.getCoins())
}
// ...
}
这是要测试的类:
class UserData(context: Context) {
val settings = context.getSharedPreferences("userdata", 0)
fun getCoins(): Int {
return settings.getInt("coins", 0)
}
fun setCoins(number: Int) {
settings.edit().clear().putInt("coins", number).apply()
}
fun addCoins(number: Int) {
if(number < 0) {
return
}
var coins = settings.getInt("coins", 0)
setCoins(coins+number)
}
}
类用户数据(上下文:上下文){
val settings=context.getSharedReferences(“userdata”,0)
fun getCoins():Int{
返回设置.getInt(“硬币”,0)
}
有趣的硬币(数字:整数){
settings.edit().clear().putInt(“硬币”,数字).apply()
}
有趣的硬币(数字:整数){
如果(数字<0){
返回
}
var coins=settings.getInt(“coins”,0)
设置硬币(硬币+数字)
}
}
使用doReturn coins
时,Mockito保存coins
在模拟设置时的值,即其初始值0
,然后返回保存的值,忽略对实际变量的更改
要使模拟查询在每次调用函数时成为变量,请使用:
on { getInt("coins", 0) } doAnswer { coins }