2017-07-25 8 views
1

私は、自分のメソッドを使用して、ユーザデータ設定メソッドからコインを追加したり減算したりする方法が正しく動作しているかどうかを確認しました。私はSharedPreferencesクラスを嘲笑し、コインの額を格納するローカル変数coinsを使用しています。 模擬メソッドがテストローカル変数から値を返さない

嘲笑のgetInt()はコインの正しい値を返していないようだが

addCoinValidが失敗したテストを実行するには(予想:5、実際:0)。私はテスト中に2つの出力を作りました:

変数:1 - mockedReturn:0
変数:5 - mockedReturn:左の数は変数と右の数の値が0

何模倣したgetInt()が返されます。

何が起こっているか教えていただけますか? :

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

そして、これがテストされたクラスである:O


これは私のテストです

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

関連する問題