Intereting Posts
Как сделать компиляциюKotlin dependsOn compileJava в gradle Файл Kotlin против класса. Какая разница? В чем причина «неразрешенной ссылки» при использовании kotlin для FacebookLogin? Создайте приложение для Android, написанное в Kotlin, используя систему Buck build Как скрыть нижнюю кнопку, когда клавиатура открыта в котлин? Android Kotlin dagger 2 Ошибка визуализации ViewModel Как десериализовать Firestore DocumentSnapshot, содержащий DocumentReference, используя Kotlin Android Room – простой запрос выбора – не удается получить доступ к базе данных в основной теме Дополнительные наблюдаемые данные в combLatest Как я могу работать с Redux / React в Kotlin.js? Присвоение свойств объекту javascript с использованием динамических имен свойств Могу ли я отправить функцию расширения через параметр функции Ввод / вывод дженериков для абстрактного контейнерного инструмента в Котлине? Получение абсолютного пути к файлу из содержимого URI для найденных изображений Динамически загружать пружину xml config

Выровненный метод, не возвращающий значение из тестовой локальной переменной

Я написал тест, чтобы проверить, работает ли мой метод добавления и вычитания монет из метода предпочтений userdata. Я высмеивал класс SharedPreferences, и я использую локальные переменные coins которые хранят сумму монеты.

Однако издеваемое getInt (), похоже, не возвращает правильное значение монет: Запуск теста addCoinValid не выполняется (Ожидаемое: 5, Фактическое: 0). Во время теста я сделал 2 выхода:

переменная: 1 – mockedReturn: 0
переменная: 5 – mockedReturn: 0

Левое число – это значение из переменной, а правое число – то, что возвращает mockinged 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 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) } } 

Solutions Collecting From Web of "Выровненный метод, не возвращающий значение из тестовой локальной переменной"

Когда вы используете doReturn coins , Mockito сохраняет значение, которое coins имели во время установки макета, то есть его начальное значение 0 , а затем возвращает это сохраненное значение, игнорируя изменения фактической переменной.

Чтобы сделать mock запрос переменной при каждом вызове функции, используйте doAnswer { ... } :

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