Android 模拟方法未从测试局部变量返回值

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

我已经编写了一个测试来检查我从userdata首选项方法中添加和减去硬币的方法是否正常工作。我模拟了SharedReferences类,使用了一个存储硬币数量的局部变量
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 }