【问题标题】:Mocked method not returning value from test-local variable模拟方法未从测试局部变量返回值
【发布时间】:2017-07-25 13:09:05
【问题描述】:

我编写了一个测试来检查我在用户数据偏好方法中添加和减去硬币的方法是否正常工作。我模拟了 SharedPreferences 类,并使用了一个局部变量 coins 来存储硬币数量。

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

变量: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())
    }
    // ...
}

这是被测试的类:

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

【问题讨论】:

    标签: android unit-testing mockito kotlin


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 2022-12-09
      • 1970-01-01
      相关资源
      最近更新 更多