Я столкнулся с этим ограничением, пытаясь смоделировать класс, который ссылается на классы, присутствующие в 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 - это полностью поддерживаемая комбинация.
Есть ли более креативное решение для этой проблемы?