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



我写了一个测试来检查我从userdata首选项方法中添加和减去硬币的方法是否正常工作。我嘲笑了SharedPreferences类,我正在使用一个局部变量coins来存储硬币数量。

然而,模拟的getInt((似乎没有返回硬币的正确值: 运行测试addCoinValid失败(预期:5,实际:0(。 我在测试期间做了 2 个输出:

变量: 1 - 模拟返回: 0变量: 5 - 模拟返回: 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())
}
// ...
}

这是测试的类:

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)
}
}

当你使用doReturn coins时,Mockito 会保存coins在模拟设置时具有的值,即它的初始值0,然后返回该保存的值,忽略对实际变量的更改。

若要使模拟查询在每次调用函数时都成为变量,请使用doAnswer { ... }

on { getInt("coins", 0) } doAnswer { coins }

相关内容

  • 没有找到相关文章

最新更新