Mockito возвращает значение null в SharedPreferences после обновления mockito-core до версии 3.0.0 - PullRequest
1 голос
/ 02 октября 2019

Рассмотрим класс тестирования ниже:

@RunWith(MockitoJUnitRunner::class)
class DatabaseManagerTest {

    private var someStringValue = "test"
    private var mockDatabaseManager: DatabaseManager? = null
    @Mock
    internal var mockSharedPreferences: SharedPreferences? = null
    @Mock
    internal var mockEditor: SharedPreferences.Editor? = null

    @Before
    fun initMocks() {
         mockDatabaseManager = createMockSharedPreference()        
    }

    private fun createMockSharedPreference(): DatabaseManager {
        `when`<String>(
            mockSharedPreferences?.getString(
               Matchers.eq(DatabaseManager.SOME_UNIQUE_KEY),
               Matchers.anyString()
            )
        ).thenReturn(someStringValue)

        `when`(mockEditor?.commit()).thenReturn(true)

        `when`<SharedPreferences.Editor>(mockSharedPreferences?.edit()).thenReturn(mockEditor)

        return DatabaseManager(mockSharedPreferences!!)
    }

    @Test
    fun sharedPreferencesHelperUpdateAndReadStoredInformation() {
        val success = mockDatabaseManager?.insert(someStringValue)

        assertThat(
            "Checking that update method returns true",
            success, `is`(true)
        )

        val savedSharedPreferenceEntry = mockDatabaseManager?.readSomeValue()

        assertThat(
           "Checking that value is stored correctly",
           someStringValue,
           `is`(equalTo(savedSharedPreferenceEntry))
        )
    }
}

Вот класс базы данных:

class DatabaseManager(private val preferences: SharedPreferences) {

    companion object {
        const val SOME_UNIQUE_KEY = "some_unique_key"
    }

    fun insert(response: String): Boolean {
        try {
            val editor = preferences.edit()
            editor.putString(SOME_UNIQUE_KEY, response)
            editor.apply()

        } catch (e: Exception) {
            e.printStackTrace()
        }
        return true
    }

    fun readSomeValue(): String? {
        return try {
            val someValue = preferences.getString(SOME_UNIQUE_KEY, null)
            someValue

        } catch (e: Exception) {
            e.printStackTrace()
            null
        }
    }
}

Когда используется старая библиотека Mockito (1.10.19), тест проходит.

При переключении mockito-core на 3.0.0 я получаю 2 устаревших предупреждения для: @RunWith(MockitoJUnitRunner::class) и Matchers. После разрешения этих двух устаревших предупреждений я ожидаю, что readSomeValue () вернет «test», но readSomeValue () вернет null.

//    testImplementation 'org.mockito:mockito-core:3.0.0'
    testImplementation 'org.mockito:mockito-core:1.10.19'

1 Ответ

0 голосов
/ 02 октября 2019

После устранения этих 2 устаревших предупреждений [...]

Пожалуйста, поделитесь, как вы решили эти предупреждения. Потому что когда я изменяю:

           Matchers.eq(DatabaseManager.SOME_UNIQUE_KEY),
           Matchers.anyString()

на

           eq(DatabaseManager.SOME_UNIQUE_KEY),
           any<String>()

и удаляю строку

    `when`(mockEditor?.commit()).thenReturn(true)

, чтобы убрать ошибку о неиспользованном насмешке, тогда проверяется пройти для меня с org.mockito:mockito-core:3.0.0.

...