Mockito + Espresso + Dagger2 => ClassNotFoundException при запуске SDK ниже, чем целевой SDK - PullRequest
0 голосов
/ 14 ноября 2018

Я столкнулся с этим ограничением, пытаясь смоделировать класс, который ссылается на классы, присутствующие в SDK> = 26, и выполнил тест на устройстве с SDK 24. Я создал тестовое приложение, чтобы лучше понять проблему.

open class RandomStuff{

    @RequiresApi(Build.VERSION_CODES.O)
    fun createDefaultNotificationChannel(): NotificationChannel {
        return NotificationChannel("test", "test", NotificationManager.IMPORTANCE_DEFAULT)
    }

    fun testString(): String = "This is a test string"
}

Обратите внимание, что класс RandomStuff ссылается на класс NotificationChannel, который можно найти только в SDK> = 26.

Тестовый объект, предоставляемый через Dagger, следующий:

@Module
class AppTestModule : AppModule() {

    @Provides
    override fun provideRandomStuff(): RandomStuff {

        return mock(RandomStuff::class.java)
    }
}

mock завершится с этим исключением: java.lang.IllegalArgumentException: не удалось создать тип at provideRandomStuff (AppTestModule.kt) , в конечном итоге вызванный ClassNotFoundException выбрасывается ByteBuddy (компонент, используемый Mockito). Мне удалось обойти эту проблему, добавив несколько проверок в мой метод предоставляет:

@Module
class AppTestModule : AppModule() {

    @Provides
    override fun provideRandomStuff(): RandomStuff? {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            return mock(RandomStuff::class.java)
        } else { 
            return null
        }
    }
}

Это временное решение очень навязчиво, так как теперь производственный код должен учитывать, что RandomStuff может быть нулевым. Я называю это ограничением, так как Mockito всегда рекламировался как среда для модульного тестирования, но кажется, что Dagger + Espresso + Mockito - это полностью поддерживаемая комбинация. Есть ли более креативное решение для этой проблемы?

...