2017-07-25 44 views
1

我已經寫了一個測試來檢查我的用於從用戶數據首選項方法中添加和減去硬幣的方法是否正常工作。我嘲笑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) 
      [email protected] 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) 
    } 
} 

回答

3

當您使用doReturn coins,的Mockito將保存coins曾在值模擬設置時間,即其初始值0,然後返回保存的值,忽略對實際變量的更改。

爲了使模擬查詢變量每次調用函數時,使用doAnswer { ... }

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

作品,謝謝。 :) – saitho